【发布时间】:2012-06-27 10:31:57
【问题描述】:
有人可以解释为什么 unsigned int 取负值吗? unsigned int 应该只取正值。
来自Wikipedia:
word, long, doubleword, longword, int
无符号:从 0 到 4,294,967,295,等于 2^32 - 1
#include <stdio.h>
typedef unsigned int uint32;
int main()
{
uint32 i;
int x = -1;
i = x%32;
printf("\n\n Value of uint32 i = %d", i);
return (0);
}
输出:
Value of uint32 i = -1
以下是我在 cpp 标准中找到的解释,我无法解释。
对于每一种有符号整数类型,都存在一个对应的(但不同的)无符号整数类型:“unsigned char”、“unsigned short int”、“unsigned int”和“unsigned long int”,它们分别占与相应的有符号整数类型相同的存储量和对齐要求(3.9);也就是说,每个有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。有符号整数类型的非负值范围是对应无符号整数类型的一个子范围,每个对应的有符号/无符号类型的值表示应相同。
4 个无符号整数,声明为无符号,应遵守算术模 2n 的定律,其中 n 是该特定整数大小的值表示中的位数
40) 关于类型和指定它们的类型说明符序列之间的对应关系,请参见 7.1.5.2。
41) 这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果会以比结果无符号整数可以表示的最大值大一的数字为模减少 输入。
【问题讨论】:
-
这里的教训是
printf不是类型安全的。