gpt4 book ai didi

c - 将字符串转换为整数的最小方法(反之亦然)

转载 作者:太空狗 更新时间:2023-10-29 15:34:06 26 4
gpt4 key购买 nike

我正在寻找一种非常小的方法来将像 "123" 这样的字符串转换为像 123 这样的整数,反之亦然。

我将在一个独立的环境中工作。这不是过早的优化。我正在创建必须适合 512 字节的代码,因此每个字节都非常重要。不过,我将采用 x86 汇编(16 位)和 C 代码(因为这很容易转换)

它不需要做任何完整性检查或任何事情..

我以为我看到了递归实现的一个非常小的 C 实现,但我似乎找不到任何尺寸优化的东西。

那么有人能帮我找到(或创建)一个非常小的 atoi/itoa 实现吗? (尽管它只需要以 10 为基数工作)

编辑:(答案)(再次编辑,因为第一个代码实际上是错误的)万一其他人遇到这个,这是我最终创建的代码。它可以容纳 21 个字节!

;ds:bx is the input string. ax is the returned integer
_strtoint:
xor ax,ax
.loop1:
imul ax, 10 ;ax serves as our temp var
mov cl,[bx]
mov ch,0
add ax,cx
sub ax,'0'
inc bx
cmp byte [bx],0
jnz .loop1
ret

好的,最后一次编辑我发誓!版本重 42 字节,支持负数..所以如果有人想使用这些,他们可以..


;ds:bx is the input string. ax is the returned integer
_strtoint:
cmp byte [bx],'-'
je .negate
;rewrite to negate DX(just throw it away)
mov byte [.rewrite+1],0xDA
jmp .continue
.negate:
mov byte [.rewrite+1],0xD8
inc bx
.continue
xor ax,ax
.loop1:
imul ax, 10 ;ax serves as our temp var
mov dl,[bx]
mov dh,0
add ax,dx
sub ax,'0'
inc bx
cmp byte [bx],0
jnz .loop1
;popa
.rewrite:
neg ax ;this instruction gets rewritten to conditionally negate ax or dx
ret

最佳答案

没有错误检查,因为那是给拥有超过 512B 的胆小鬼们玩的:

#include <ctype.h>
// alternative:
// #define isdigit(C) ((C) >= '0' && (C) <= '9')

unsigned long myatol(const char *s) {
unsigned long n = 0;
while (isdigit(*s)) n = 10 * n + *s++ - '0';
return n;
}

gcc -O2 将其编译成 47 个字节,但对 __ctype_b_loc 的外部引用可能超出您的承受能力...

关于c - 将字符串转换为整数的最小方法(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com