unsigned short a;
char temp[] = "70000";
a = atoi(temp);
printf("a: %d\n", a);
当我从 ASCII 转换为十进制时,输出结果是 a: 4464
,但实际上应该是 a: 70000
。有没有更好的方法可以进行转换?无符号短整型的范围是 0 到 65535。
unsigned short a;
char temp[] = "70000";
a = atoi(temp);
printf("a: %d\n", a);
当我从 ASCII 转换为十进制时,输出结果是 a: 4464
,但实际上应该是 a: 70000
。有没有更好的方法可以进行转换?无符号短整型的范围是 0 到 65535。
正如schnaader所说的,你可能遇到了溢出问题。
但是针对你关于输出无符号值的printf
问题,你需要使用u
修饰符(表示“无符号”)。在这种情况下,就像Jens在下面指出的那样,你需要使用%hu
:
printf("a: %hu\n", a);
虽然仅使用%u
(即unsigned int
而非unsigned short
)也可能有效,因为当printf
将short
推送到堆栈时,它将被提升为int
。
但是,这仅在值70000适合您的平台上的unsigned short
时才有效。
unsigned short
的范围是0-65535,所以70000无法放入其中(2字节),请改用4字节的数据类型(unsigned int
应该可以工作,您可以使用 sizeof
检查大小)。
h
格式说明符是否在 C 标准中定义?(不是 C++,也不是特定编译器。)我的记忆(有点模糊!)是,在像printf
这样的可变参数情况下,short
值会被转换为int
并推入堆栈。编辑:例如,我从这里得到了预期的输出(42, 60000, 42
):http://pastie.org/1613793gcc -Wall
没有给我任何警告(GCC 4.4.3)。但当然,这可能只是某个地方帮助了我,可能是特定于我的架构或编译器等等。 :-) - T.J. Crowderunsigned short
适合于它,则参数将被提升为int
,否则为unsigned int
。但这只是一个不同的事情,格式说明符告诉printf
如何解释它接收到的int
。 - Jens Gustedt