0

代码:

char temp[] = "1010000001010011";
printf("%s\n", temp);
unsigned long num = atoi(temp);
printf("%lu\n", num);

输出:

1010000001010011
4081617243

为什么 num 不是 41043?

4

3 回答 3

2

atoi("1010000001010011");尝试将文本作为十进制字符序列转换为int. 如果int足够宽,它将采用十进制值 1,010,000,001,010,011。毫不奇怪,该值超出了 OP 的int范围,因此结果是未定义的行为或 UB。

要将字符串转换为二进制字符,请使用strtol()strtoul()

char temp[] = "1010000001010011";
char *endptr;
int base = 2;
unsigned long ulnum = strtoul(temp, &endptr, base);
if (endptr == temp) puts("No conversion");
else printf("%lu\n", ulnum);  // 41043
于 2017-03-25T03:13:49.117 回答
1

atoi返回一个int值。1010000001010011十六进制的十进制数39696F348895B不适合 32 位变量,并被截断F348895B为带符号的十进制值的十六进制-213350053。但是,将该值分配给 是未定义的行为unsigned long,尽管编译器生成的代码确实分配了该位模式,而这unsigned long恰好是4081617243.

非常感谢@AnT和@chux

于 2017-03-24T21:15:48.630 回答
-1

Beacouseatoi()将字符串转换为整数,而不是从二进制转换。例如代码

char str[]="123";
printf("%d",atoi(str));

将 123 打印为整数

于 2017-03-24T22:12:57.527 回答