vip*_*aos 10 storage unsigned signed
两个补码被设置为使计算机更容易计算两个数的减法.但计算机如何区分整数是有符号整数还是无符号整数?它的内存只有0和1.
例如, 1111 1111
在计算机中,存储器可以表示数字255,但也可以表示-1.
Sjo*_*erd 14
签名和未签名使用相同的数据,但使用不同的指令.
计算机将有符号和无符号整数存储为相同的数据.即255和-1是相同的位.但是,您告诉编译器变量具有什么类型.如果它是有符号的,则编译器使用带符号的运算符来操作变量(例如IDIV),而当无符号时,它使用另一条指令(例如DIV).因此编译器会生成一个程序,告诉CPU如何解释数据.
它不能区分它们。但是有了补码,计算是一样的:
在下面,d
将附加到十进制数字和b
二进制数字。计算将基于8位整数。
-1d + 1d = 1111 1111b + 1b = 1 0000 0000b
但是由于我们溢出了(是的,这是8 0
s,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
因此,无符号与有符号只是无符号的视觉表示,仅在显示给人类时使用:-)