2014-06-05 67 views
-2

见下面的代码,数据在内存中的有符号和无符号表示形式?

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

unsigned sum = a + b; 
printf("%d ", sum); 

输出 - 16

据我所知,的

136 - ox88 
-120 - ox88 

1),所以它应该打印0 ISN”

十六进制表示T IT?

2)如何在存储器中将-ve(带符号)的数字表示为unsigned int?是这样的,

-120 = 0xffffff88 
136 = 0x00000088 

如果是,在unsigned int的范围内可能有等于值“0xffffff88”,所以它会冲突给对方?

谁能解释以实例的概念?(符号和无符号表示)

+0

哪个endianess? –

+1

先阅读[二补](http://en.wikipedia.org/wiki/Two's_complement)。 –

+0

136 - 120 = 16.有什么令人惊讶的呢?二进制表示在这里不起作用。 – Suma

回答

0

你的第二个二进制表示是正确的。 添加该2张进制数一起,你会得到十进制十六进制0x10的或16(和溢流)在无符号整型

-120将具有值4 294 967 176 4字节无符号整型

+0

那么4 294 967 176与unsigned int range中的另一个数字冲突吗? – Melvin

+0

你是什么意思与冲突?每个可能的数字在一个数据类型中都有自己唯一的二进制表示,所以不存在冲突。如果您从一种数据类型切换到另一种数据类型,则只有问题。 – mch

2

有不需要猜测内存中的事物是如何表示的,而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

所以unsigned int可以存储一个-ve的值像signed int一样吗?所以它不与另一个无符号整数值冲突?假设在unsigned char ch = -1;所以-1会与255.相冲突吗?不是吗?因为它们都具有相同的表示0xFF。你能解释吗? – Melvin

+0

@Melvin你描述的冲突没有任何问题。有符号和无符号整型可以有相同的表示形式。值就是你如何解释这些位 – merlin2011

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

另外1在结果前面被丢弃。

1在倒数第二个位置的结果是从进位加8 + 8.

相关问题