设置二进制补码以使计算机更容易计算两个数字的减法。但是计算机如何区分一个整数是有符号整数还是无符号整数呢?它的记忆中只有 0 和 1。
例如, 1111 1111
计算机内存中可以表示数字255,也可以表示-1。
有符号和无符号使用相同的数据,但指令不同。
计算机将有符号和无符号整数存储为相同的数据。即 255 和 -1 是相同的位。但是,您告诉编译器变量的类型。如果它是有符号的,编译器使用有符号的操作符来操作变量(例如IDIV),当它没有符号时,它使用另一个指令(例如DIV)。因此编译器编写了一个程序来告诉 CPU 如何解释数据。
它不区分它们。但是有了补码,计算是一样的:
下面,d
将附加到十进制数和b
二进制数。计算将基于 8 位整数。
-1d + 1d = 1111 1111b + 1b = 1 0000 0000b
但是由于我们溢出了(是的,那是 8 0
s 和1
8 位整数上的 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
因此,无符号与有符号只是无符号的视觉表示,仅在向人类显示时使用:-)