0

有人可以解释为什么 unsigned int 取负值吗?Anunsigned int应该只取正值。

来自维基百科

word, long, 双字, 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) 40) ;也就是说,每个有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。有符号整数类型的非负值范围是对应无符号整数类型的子范围,每个对应的有符号/无符号类型的值表示应相同。

4 声明为无符号的无符号整数应遵守算术模 2n 的定律,其中 n 是该特定整数大小的值表示中的位数

40) 关于类型和指定它们的类型说明符序列之间的对应关系,请参见 7.1.5.2。

41) 这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。

4

2 回答 2

17

您使用了错误的标志printf。应该是%u

printf("\n\n Value of uint32 i = %u", i);

于 2012-06-27T10:34:07.020 回答
7

可以用许多不同的方式解释相同的位模式。有符号整数和无符号整数之间的唯一区别在于解释它们的位模式的方式。您的代码指示printf将 unsigned int 解释为有符号,这就是您看到负数的原因。

作为一个实验问题,试试这个:

printf("%u\n", -1);

这将产生一个很大的正数 - 与您在帖子中描述的情况直接相反。再一次,printf被要求将有符号数解释为无符号数,因此它很乐意将符号扔掉,并像无符号一样打印该值。

于 2012-06-27T10:35:14.747 回答