Unsigned int取负值

时间:2012-06-27 10:31:58

标签: c++ c

有人可以解释为什么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”,每个都占用相同的存储量并且具有与对应的有符号整数类型40相同的对齐要求(3.9);也就是说,每个有符号整数类型具有与其对应的无符号整数类型相同的对象表示。有符号整数类型的非负值范围是相应无符号整数类型的子范围,每个对应的有符号/无符号类型的值表示应相同。

     

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

     

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

     

41)这意味着无符号算术不会溢出,因为无法用结果无符号整数类型表示的结果以一个大于可由结果无符号整数表示的最大值的数量的模数减少。   类型。

2 个答案:

答案 0 :(得分:16)

您使用printf的错误标记。它应该是%u

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

答案 1 :(得分:7)

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

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

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

这将产生一个大的正数 - 与您在帖子中描述的情况正好相反的情况。同样,printf被要求将带符号的数字解释为无符号数字,因此它会愉快地抛出符号,并将值打印为无符号。