如何判断整数是否已签名?

时间:2016-10-13 15:49:35

标签: binary digital-logic

我/计算机如何判断二进制数是有符号还是无符号整数? 例如,二进制数1000 0001可以被解释为-128(如果有符号),129(如果是无符号的)。

在C语言中使用无符号整数的一个优点(据我所知)是因为没有定义符号所带来的额外比特,所以它可以使用更大的整数。然而,在我看来,你需要一些东西来跟踪第一位代表一个符号,或者只是描述数字大小的一部分。

3 个答案:

答案 0 :(得分:2)

在内存中,无论是无符号还是有符号,计算机都会将二进制表示存储为10000001。只需查看内存中的数字,就不可能将二进制数分类为有符号或无符号。我们需要说明是否应该将此号码视为未签名或已签名。这是编译器的用武之地。作为程序员,您将指定该编号为unsigned签名。编译器将转换所编写的代码并为该数字生成所需的指令。请注意,根据编程语言,可能有不同的方法来生成这些指令。要记住的重要部分是内存中的二进制数没有区别,只是程序员如何传达如何将这个数字对待编译器。

答案 1 :(得分:1)

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

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这样的语言,它不支持无符号数字类型。

答案 2 :(得分:0)

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