【发布时间】:2018-07-03 17:43:25
【问题描述】:
(假设是64位机器)
例如
int n = 0xFFFFFFFF; //max 32bit unsigned number
printf("%u\n", n);
常规有符号整数(32 位)可以存储的最大正数是0x7FFFFFFF。
在上面的示例中,我将最大 unsigned 整数值分配给常规有符号整数,我没有收到来自 GCC 的警告或错误,并且打印结果没有问题(使用 @ 987654325@)。
将U 或L 附加到十六进制常量不会改变任何内容。
这是为什么呢?
【问题讨论】:
-
0xFFFFFFFF不是有符号或无符号值,而是位模式的十六进制表示,在其上下文中是有意义的。 -
@WeatherVane
0xFFFFFFFF有一个类型... -
对于带符号的 32 位整数,值 0xFFFFFFFF 是有效的 -1(2 的补码)。即使超出范围,C 也不会进行任何范围检查(据我所知);值只是被截断。这使得编译的 C 代码速度更快。需要时编写正确的代码或范围检查的负担由开发人员承担。
-
这里
n的实际值是实现定义的。如果int是32 位长,那么0xFFFFFFFF的类型是unsigned int(请参阅here)。然后转换为int,结果为implementation defined。将int打印为%x或%u是未定义的行为。 -
根据 C 2011 (N1570) 6.4.4.1 第 5 段,不带后缀的十六进制常量的类型是以下可以表示其值的第一个:
int、unsigned int、@ 987654340@、unsigned long int、long long int和unsigned long long int。因此,在int有32 个值位的C 实现中,0xFFFFFFFF是unsigned int。在int有64 个值位的C 实现中,0xFFFFFFFF是int。
标签: c integer unsigned-integer