计算机如何区分整数是签名还是未签名?

时间:2012-06-05 07:23:17

标签: storage unsigned signed

设置两个补码,使计算机更容易计算两个数的减法。但计算机如何区分整数是有符号整数还是无符号整数? 它的内存只有0和1。

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

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

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

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

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

但是因为我们溢出(是的,8个0和8个整数的1,所以结果等于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

无符号与有符号只是无符号的直观表示,仅在向人类显示时使用: - )