我/计算机如何判断二进制数是有符号还是无符号整数? 例如,二进制数1000 0001可以被解释为-128(如果有符号),129(如果是无符号的)。
在C语言中使用无符号整数的一个优点(据我所知)是因为没有定义符号所带来的额外比特,所以它可以使用更大的整数。然而,在我看来,你需要一些东西来跟踪第一位代表一个符号,或者只是描述数字大小的一部分。
答案 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)
变量类型会跟踪它是已签名还是未签名。寄存器中的实际值无法告诉您(因为您需要额外的位来存储该信息)。您可以打开警告,警告无符号转换为有符号的转换,然后如果您不小心将无符号值分配给已签名的值,编译器会对您大喊大叫,反之亦然。