2011-05-06 74 views
2
5 (decimal) in binary 00000101 
-5 (two's complement) in binary 11111011 

但是11111011也是251(十进制)!二进制负整数

电脑如何辨别彼此? 它是如何知道它是-5还是251?

它是相同的11111011

在此先感谢!

+4

电脑其实不在乎哪个是哪个;只有程序可以。 – 2011-05-06 14:09:11

回答

4

签名字节的最大值为127

无符号字节不能是负数。

编译器知道保存该值的变量是有符号还是无符类型,并对其进行适当处理。

+0

准确编译器如何将带符号的8位int a = -7转换为二进制?它会产生8位值还是32位(在32位系统上)有24个零? – DrStrangeLove 2011-05-06 15:07:20

+0

它会填满所需的大空间。但只会有两个0。 – 2011-05-08 03:50:50

0

如果程序选择将字节视为带符号,则运行时系统根据高位确定字节是被视为正还是负。该高位中的1(位7,从低位0开始计数)表示该数字为负数;该位位置的0表示该数字为正值。因此,在11111011的情况下,位7被设置为1,并且相应地将该数字视为负数。

如前所述,由于符号位占用一位的位置,因此数字的绝对幅度范围可以从0到127。

如果你的程序选择治疗字节为无符号,在另一方面,你会被符号位包括在大小,这样就可以从0到255

0

2的补设计允许使用无符号数字相同的方式将有符号数字相加或相减。所以只有两种情况下数字的签名会影响计算机的低级别。

  1. 当有溢出
  2. 当你在混合执行操作:一个签名的,一个无符号

不同的处理器对本不同的策略。 WRT orverflows,MIPS RISC架构,例如,处理使用陷阱的溢出。见http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats

据我所知,混合签署和未签名的需要,以避免在程序级别。

0

如果你问“程序如何知道如何解释值” - 一般来说,这是因为你已经告诉编译器你赋值给的变量的“类型”。该程序实际上并不关心0x00000101是否为“5位十进制”,它只是一个无符号整数,其值为0x00000101,它可以对无符号整数执行合法的操作,并且如果您尝试与其进行比较或执行操作,将以给定方式执行操作到不同的“类型”变量。所有数据(字符串,数字,图像,声音等等)和编译后的代码最终都是以一个大的二进制blob结尾的。