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

C 内存中数据的有符号和无符号表示?,c,unsigned,signed,C,Unsigned,Signed,参见下面的代码 signed int a = 136; unsigned int b = -120; unsigned sum = a + b; printf("%d ", sum); 输出-16 据我所知, 的十六进制表示 136 - ox88 -120 - ox88 1) 所以它应该打印0。不是吗 2) 一个-ve(有符号)数在内存中如何表示为无符号整数?是这样吗? -120 = 0xffffff88 136 = 0x00000088 如果是,在无符号整数范围内,可能有一个等于

参见下面的代码

signed int a = 136; 
unsigned int b = -120; 

unsigned sum = a + b;
 printf("%d ", sum);
输出-
16

据我所知,

的十六进制表示

136 - ox88
-120 - ox88
1) 所以它应该打印0。不是吗

2) 一个-ve(有符号)数在内存中如何表示为无符号整数?是这样吗?

-120 = 0xffffff88
136 = 0x00000088
如果是,在无符号整数范围内,可能有一个等于“0xFFFF88”的值,那么它是否会相互冲突


有人能举例说明这个概念吗?(有符号和无符号表示)

您的第二个二进制表示是正确的。 将这两个二进制数相加,将得到十六进制的0x10或十进制的16(以及溢出)


-120 in unsigned int的值为4字节unsigned int的值为4 294 967 176

无需猜测内存中的内容是如何表示的,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%x\n", a,b, sum);
}
在2的补码中,我们可以将
a
b
以二进制形式求和,而不用担心符号

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

0xffffff88 +
0x00000088
----------
0x00000010 => 16
此外,结果前面的1将被丢弃


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

Read first.136-120=16。这有什么奇怪的?二进制表示在这里不起作用。您在1)的推理中省略了您说“…和0x88+0x88=0,因此…”的步骤。你看到问题了吗?我知道2的赞美。但是我感到困惑。如何在无符号int中存储-ve值?它将如何在内存中表示?0x88+0x88=0,好的,右帕斯卡。但它没有给出16。但答案是16!它是如何计算的?所以unsigned int可以像signed int一样存储-ve值?那么它是否与unsigned int中的另一个值冲突?假设在无符号字符中ch=-1;因此-1将与255冲突。不是吗?因为它们都有相同的表示0xFF。你能解释一下吗?@Melvin你描述的冲突没有什么不对的。有符号和无符号整数类型当然可以具有相同的表示形式。这个值就是你解释比特的方式。4 294 967 176与无符号整数范围内的另一个数字冲突吗?冲突是什么意思?在一种数据类型中,每个可能的数字都有自己独特的二进制表示形式,因此不存在冲突。只有从一种数据类型切换到另一种数据类型时才会出现问题。
0xffffff88 +
0x00000088
----------
0x00000010 => 16