请参阅以下代码,
signed int a = 136;
unsigned int b = -120;
unsigned sum = a + b;
printf("%d ", sum);
输出-16
据我所知,
的十六进制表示
136 - ox88
-120 - ox88
1( 所以它应该打印0。不是吗?
2( -ve(有符号(数在内存中如何表示为unsigned int?是这样的吗
-120 = 0xffffff88
136 = 0x00000088
如果是,在unsigned int范围中可能有一个等于"0xffffff88"的值,那么它会相互冲突吗?
有人能举例说明这个概念吗?(有符号和无符号表示(
不需要猜测事物在内存中是如何表示的,2的补码算法是与endianness无关的。
考虑以下程序。
#include <stdio.h>
int main(){
signed int a = 136;
unsigned int b = -120;
unsigned sum = a + b;
printf("a = 0x%x b = 0x%x sum = 0x%xn", a,b, sum);
}
输出:
a = 0x88 b = 0xffffff88 sum = 0x10
在2的补码中,当我们可以在二进制中求和a
和b
时,不必担心符号。
当我们手工求和时,我们将得到a + b = 0x100000010
。由于第一个1
溢出,它被简单地丢弃,留给我们的是0x10
,即16
。
您的第二个二进制表示是正确的。把这两个二进制数字加在一起,你会得到十六进制的0x10或十进制的16(以及溢出(
-无符号int中的120将在4字节无符号int 中具有值4 294 967 176
0xffffff88 +
0x00000088
----------
0x00000010 => 16
结果前面的1也被丢弃。
结果中倒数第二位的1是通过加8+8得到的进位。