13

设置二进制补码以使计算机更容易计算两个数字的减法。但是计算机如何区分一个整数是有符号整数还是无符号整数呢?它的记忆中只有 0 和 1。

例如, 1111 1111计算机内存中可以表示数字255,也可以表示-1。

4

2 回答 2

17

有符号和无符号使用相同的数据,但指令不同。

计算机将有符号和无符号整数存储为相同的数据。即 255 和 -1 是相同的位。但是,您告诉编译器变量的类型。如果它是有符号的,编译器使用有符号的操作符来操作变量(例如IDIV),当它没有符号时,它使用另一个指令(例如DIV)。因此编译器编写了一个程序来告诉 CPU 如何解释数据。

于 2012-06-05T07:36:21.540 回答
6

它不区分它们。但是有了补码,计算是一样的:

下面,d将附加到十进制数和b二进制数。计算将基于 8 位整数。

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

但是由于我们溢出了(是的,那是 8 0s 和18 位整数上的 a),结果等于 0。

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

如果您考虑对无符号的这些操作(二进制值将保持不变):

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

因此,无符号与有符号只是无符号的视觉表示,仅在向人类显示时使用:-)

于 2012-06-05T07:34:42.683 回答