如何判断一个整数是否有符号?

How to tell if an integer is signed or not?

I/computer如何判断二进制数是有符号整数还是无符号整数? 例如,二进制数 1000 0001 如果有符号则可以解释为 -128,如果没有符号则可以解释为 129。

在像 C 这样的语言中使用无符号整数的一个优点(据我所知)是它使您能够使用更大的整数,因为没有定义符号会获得额外的位。但是,在我看来,您似乎在某个地方需要一些东西来跟踪第一位是代表一个符号还是只是描述数字大小的一部分。

变量类型跟踪它是有符号的还是无符号的。寄存器中的实际值无法告诉您(因为您需要额外的位来存储该信息)。您可以打开警告,警告不要将 unsigned 转换为 singed,然后如果您不小心将 unsigned 值分配给 signed 值或相反,编译器将对您大喊大叫。

在内存中,无论是无符号还是有符号,计算机都会将二进制表示存储为 10000001。仅通过查看内存中的数字,不可能将二进制数分类为有符号或无符号。我们需要说明来判断我们应该将这个数字视为无符号数还是有符号数。这就是编译器发挥作用的地方。作为程序员,您会将有符号数指定为无符号数。编译器将翻译编写的代码并为该数字生成所需的指令。请注意,根据编程语言的不同,可能有不同的生成这些指令的方法。要记住的重要部分是内存中的二进制数没有区别,只是程序员如何与编译器沟通应该如何处理这个数字。

计算机不需要知道符号。这是关于如何打印数字。算术工作正常,它不介意它是有符号的还是无符号的。当它被修剪到需要的长度时,结果是正确的。

8 位乘法示例:

// negative times negative
254 * 254             = 64516               // decimal unsigned - it's equal to 4
((-2) * (-2))         = 4                   // decimal signed
1111 1110 * 1111 1110 = 1111 1100 0000 0100 // binary - 0000 0100

// negative times positive
254 * 2               = 508              // decimal unsigned - it's equal to (-4)
-2 * 2                = -4                  // decimal signed
1111 1110 * 0000 0010 = 0000 0001 1111 1100 // binary - 1111 1100

因此,如何表示 1111 1100 取决于您。如果您使用 Java 之类的语言,它不支持无符号数字类型。