有人可以解释为什么unsigned int取负值?一个unsigned 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);
}
Run Code Online (Sandbox Code Playgroud)
Value of uint32 i = -1
Run Code Online (Sandbox Code Playgroud)
以下是我在cpp标准中找到的解释,我无法解释.
对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型:"unsigned char","unsigned short int","unsigned int"和"unsigned long int",每个占用相同的量存储并具有与对应的有符号整数类型40相同的对齐要求(3.9); 也就是说,每个有符号整数类型具有与其对应的无符号整数类型相同的对象表示.有符号整数类型的非负值范围是相应无符号整数类型的子范围,每个对应的有符号/无符号类型的值表示应相同.
4无符号整数,声明无符号整数,应遵守算术模2n的定律,其中n是整数特定大小的值表示中的位数
40)关于类型之间的对应关系以及指定它们的类型说明符序列,请参见7.1.5.2.
41)这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量减少.
可以以许多不同方式解释相同的位模式.有符号和无符号整数之间的唯一区别在于它们的位模式被解释.您的代码指示printf
将unsigned int解释为signed,这就是您看到负数的原因.
作为试验,试试这个:
printf("%u\n", -1);
Run Code Online (Sandbox Code Playgroud)
这将产生一个大的正数 - 这与您在帖子中描述的情况正好相反.再一次,printf
要求将带符号的数字解释为无符号数,因此它很乐意抛出符号,并将值打印为无符号.
归档时间: |
|
查看次数: |
2663 次 |
最近记录: |