使用atoll()函数需要注意的地方

2018-05-24  本文已影响0人  delims

有这样一个测试程序:

#include

#include

int main(void)

{

char *str =  "4000000000";

        int64_t a = 0;

a = atoll(str);

printf("a = %lld/n", a);

printf("a = %llu/n", a);

}

结果会是怎样?

结果是这样:

a = -294967296

a = 18446744073414584320

如果代码修改为:

#include

#include

#include  //Only she can resolve this problem

int main(void)

{

char *str =  "4000000000";

        int64_t a = 0;

a = atoll(str);

printf("a = %lld/n", a);

printf("a = %llu/n", a);

}

结果正确了:

a = 4000000000

a = 4000000000

是不是很神奇?

经过对两段代码汇编跟踪,发现出错的代码比输出正确的代码多了一个sar的命令

sarl $0x1f %edx

这条指令是将64位数的高32为向右移动31位。因为40亿这个数高位是1,所以整个高32会被1填满。

看来是用atoll函数还是要慎重,注意引用头文件。不然错了都不知道怎么回事。

上一篇下一篇

猜你喜欢

热点阅读