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

vip*_*aos 10 storage unsigned signed

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

例如, 1111 1111在计算机中,存储器可以表示数字255,但也可以表示-1.

Sjo*_*erd 14

签名和未签名使用相同的数据,但使用不同的指令.

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

  • 值得注意的是,在大多数CPU上,指令仅在乘法(IA32的MUL/IMUL)和除法(DIV/IDIV)([指令参考](http://www.posix.nl/linuxassembly/nasmdochtml)的情况下不同. /nasmdoca.html)).关于2的补码的好消息并不是它更容易减去,但是这个加法(ADD)并不关心数字是有符号还是无符号.因此,减法确实更容易,因为减去一个可以很容易地计算减数的2的补数并将其加到减数中. (2认同)

Sch*_*ron 5

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

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

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

但是由于我们溢出了(是的,这是8 0s,a 1是8位整数),所以结果等于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

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