Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何知道二进制整数是否表示负数?_C_Binary_Cpu Registers_Processor - Fatal编程技术网

C 如何知道二进制整数是否表示负数?

C 如何知道二进制整数是否表示负数?,c,binary,cpu-registers,processor,C,Binary,Cpu Registers,Processor,我正在读一些C文本。在正负值课程中,作者提到了以二进制形式表示负数的几种方法 我理解了所有的方法,想知道如果给定一个二进制数,我们能确定它是否为负数吗 例如,-92具有8位二进制格式:10100100。但是如果我们得到的是10100100我们能说那是-92,而不是其他非负数吗?你想读一下数字。简而言之,最高有效位可用于确定数字是否为负数 我重读了你的问题,你说你已经理解了二的补语。处理负数时,必须知道位数以确定该数字是否为负数。负数必须符号扩展到所需的位数。当以32位存储时,-92的示例是111

我正在读一些C文本。在正负值课程中,作者提到了以二进制形式表示负数的几种方法

我理解了所有的方法,想知道如果给定一个二进制数,我们能确定它是否为负数吗

例如,-92具有8位二进制格式:
10100100
。但是如果我们得到的是
10100100
我们能说那是-92,而不是其他非负数吗?

你想读一下数字。简而言之,最高有效位可用于确定数字是否为负数


我重读了你的问题,你说你已经理解了二的补语。处理负数时,必须知道位数以确定该数字是否为负数。负数必须符号扩展到所需的位数。当以32位存储时,-92的示例是1111111110100100。

当然,这取决于表示形式。在广泛使用的2的补码中,您只需查看最重要的位

例如,(数字)-92具有二进制形式:10100100(以8位字节表示)。但如果给我们10100100,我们能说是-92,而不是其他非负数吗

不,您需要提前知道是否使用了有符号或无符号表示/约定,即使您知道该表示/约定是有符号的,也需要知道用于存储数字的表示/约定

如果8位整数(即字节)是有符号的,那么根据Tom和32位KID,有符号整数通常存储在中,其中将确定数字是否为负数

e、 g.在您的示例中,字节
10100100
可以表示有符号字节
-92
,因为:

MSB : 1 means negative
Other 7 Bits 0100100 
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left : 
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64 
= 92 (and thus -92 because of the MSB)
或者,如果该值是一个无符号字节,则MSB仅被视为2的下一次幂,与所有低位相同

i、 e.
10100100
可以表示:

4 + 32 + 128 
= 164
(同样,二次幂,从右到左,省略
0
二次幂)

关于整数是否应该有符号以及所需位数的决定通常由需要存储在其中的值的范围决定。例如,32位有符号整数可以表示范围:

–2147483648 to 2147483647
而无符号32位整数可以表示

0 to 4294967295

必须要求您知道数字的类型(有符号/无符号),才能确定负数/正数。如果未提及类型,则默认情况下会对其进行签名。若它是有符号的,那个么您可以查看MSB位来确定是否为正。如果该值被称为无符号,则必须计算MSB位以使十进制为否。

如果内存中有该值,请将其转换为具有相同大小的有符号,如果该值小于零,则进行测试。所以,
如果((int)值<0)


如果试图从字符串解析二进制常量,则需要知道数字的格式。然而,二人转已经普遍存在了50年了。(一个例外是对某些仍在使用的旧Unisys大型机的二进制兼容支持。)为此,您只需查看第一位(正如公认的答案所说)。

+1表示完整性。虽然实际上很少有体系结构不是2的补码用于有符号整数存储。如果是1的补码或符号大小,代码也只会查看最重要的位。除了
-0
之外,2的补码对于知道符号的性质没有什么特别之处。填充和endian也是需要考虑的因素。知道类型是有符号的还是无符号的肯定是有价值的。编辑现有注释而不是添加新注释。是的,哎呀,在我已经添加了注释之后,我意识到了这一点。你的意思是回答,对吗?+1-如果你只是得到一些字节而不知道它们的类型,它可能是一个int,一个无符号int,一个float,一个char,一个struct。。。这应该是公认的答案。这个答案清楚地解释了这个问题。您所说的“必须计算MSB位才能使十进制为否”是什么意思?此外,“MSB”中的“B”表示“位”,因此您不必写“MSB位”,您可以使用“MSB”或“最高有效位”。“如果未提及类型,则默认情况下它是有符号的”-->异常情况下,
int x:8
等位字段可能是有符号的或无符号的。