内存中数据的c符号和无符号表示



请参阅以下代码,

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的补码中,当我们可以在二进制中求和ab时,不必担心符号。

当我们手工求和时,我们将得到a + b = 0x100000010。由于第一个1溢出,它被简单地丢弃,留给我们的是0x10,即16

您的第二个二进制表示是正确的。把这两个二进制数字加在一起,你会得到十六进制的0x10或十进制的16(以及溢出(

-无符号int中的120将在4字节无符号int 中具有值4 294 967 176

0xffffff88 +
0x00000088
----------
0x00000010 => 16

结果前面的1也被丢弃。

结果中倒数第二位的1是通过加8+8得到的进位。

相关内容

  • 没有找到相关文章

最新更新