首页 文章

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

提问于
浏览
-2

看下面的代码,

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”的值,那么它会相互冲突吗?

任何人都可以用例子解释这个概念吗?(有符号和无符号表示)

3 回答

  • 0

    没有必要猜测事物在内存中是如何表示的,而2的补码算法是与字节序无关的 .

    考虑以下程序 .

    #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%x\n", a,b, sum);
    }
    

    输出:

    a = 0x88 b = 0xffffff88 sum = 0x10
    

    在2的补码中,当我们可以在二进制中求和 ab 而不用担心符号 .

    当我们手工完成这笔钱时,我们会得到 a + b = 0x100000010 . 由于第一个 1 溢出,它只是被删除,留下我们 0x10 ,这是 16 .

  • 0

    你的第二个二进制表示是正确的将这2个二进制数加在一起,你会得到十六进制的0x10或十进制的16(和溢出)

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

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

    结果前面的1也被丢弃 .

    结果中倒数第二个位置的1是来自进位加8 8 .

相关问题