我在维基百科和stack overflow上看到了两个补充,这是我理解的,但我不确定它是否正确
有符号整型
最左边的位被解释为-231,这样我们就可以得到负数
无符号整型
最左边的位被解释为+231,这就是我们获得大正数的方法
更新
当我们存储3vs-3时,编译器会看到什么?
我以为3总是00000000000000000000000011
并且-3始终是111111111111111111111111 01
C中3 vs-3的示例:

unsigned int x = -3;
int y = 3;

printf("%d %d\n", x, y); //  -3 3
printf("%u %u\n", x, y); // 4294967293 3
printf("%x %x\n", x, y); // fffffffd 3

最佳答案

二的补码是用二进制表示负整数的一种方法。
首先,这里有一个标准的32位整数范围:

Signed = -(2 ^ 31) to ((2 ^ 31) - 1)
Unsigned = 0 to ((2 ^ 32) - 1)

在two的补码中,一个负数的表示方法是将其正数的位反转并加上1:
10 which is 00001010 becomes -10 which is 11110110 (if the numbers were 8-bit integers).

此外,只有在计划使用位运算符时,二进制表示才很重要。
如果你做基本的算术,那么这不重要。
在上述时间之外,唯一可能产生意外结果的时间是获得签名版本(2<您的问题不一定与表示有关,而是与类型有关。
无符号整数中的负数表示相同,区别在于它变成了一个超高数字,因为它必须是正数,符号位工作正常。
您还应该认识到((2^32)-5)与-5是完全相同的,如果值是无符号的,等等。
因此,以下情况成立:
unsigned int x = (2 << 31) - 5;
unsigned int y = -5;
if (x == y) {
  printf("Negative values wrap around in unsigned integers on underflow.");
}
else {
  printf( "Unsigned integer underflow is undefined!" );
}

关于c - unsigned int和int之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27891294/

10-10 12:43