有这样一个测试程序:
#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函数还是要慎重,注意引用头文件。不然错了都不知道怎么回事。
网友评论