二进制中的负整数

3
 5 (decimal) in binary  00000101
-5 (two's complement) in binary 11111011

但是11111011也可以表示十进制的251!

计算机如何区分它们?它如何知道是-5还是251?

它们都是相同的11111011。

提前感谢!


4
电脑并不在乎哪个是哪个,只有程序在乎。 - Ignacio Vazquez-Abrams
4个回答

4

有符号字节的最大值为127

无符号字节不能为负数。

编译器知道保存该值的变量是有符号还是无符号类型,并相应地处理它。


编译器将如何将有符号的8位整数a = -7转换为二进制?它会生成8位值还是32位值(在32位系统上)并带有24个零? - DrStrangeLove
它将填充尽可能大的空间。但只会有两个0。 - Ignacio Vazquez-Abrams

0

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

由于符号位占用了一个比特位置,因此数字的绝对值可以从0到127范围内,如前所述。

另一方面,如果您的程序选择将字节视为无符号的,则本来是符号位的比特包含在幅度中,这样幅度就可以从0到255范围内变化。


0

二进制补码的设计是为了让有符号数可以像无符号数一样相加/相减。因此,只有两种情况下有符号数的符号会影响计算机在低级别上的运算。

  1. 当发生溢出时
  2. 当你对混合操作进行操作时:一个有符号,一个无符号

不同的处理器采取不同的策略。例如,MIPS RISC架构处理溢出时使用陷阱。请参见http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats

据我所知,在程序级别上需要避免混合使用有符号和无符号数。


0

如果你问“程序如何知道如何解释值” - 一般来说,这是因为你已经告诉编译器你分配值的变量的“类型”。程序实际上并不关心00000101作为“5十进制”,它只有一个无符号整数,其值为00000101,可以执行对无符号整数合法的操作,并且如果您尝试与或转换为不同“类型”的变量进行比较,则会以给定的方式行为。

归根结底,编程中的所有内容都归结为二进制 - 所有数据(字符串、数字、图像、声音等等)和编译后的代码最终都成为一个大的二进制块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接