c - 如何知道二进制整数是否代表负数?

标签 c binary cpu-registers processor

我正在阅读一些 C 文本。在负值和正值环节,作者提到了几种用二进制形式表示负数的方法。

一路看懂了,想知道给定一个二进制数,能不能判断它是不是负数?

例如,-92 具有 8 位二进制形式:10100100。但是,如果给定 10100100,我们可以说它是 -92,而不是其他非负数吗?

最佳答案

For example, the (number) -92 has the binary form: 10100100 (in an 8 bit byte representation) . But if we are given 10100100, can we say that is -92, and not other non-negative number?

不,您需要提前知道使用的是签名还是未签名的表示/约定,即使您知道它是签名的,那么您还需要知道 encoding用于存储号码。

如果 8 位整数(即字节)是有符号的,那么根据 Tom 和 32bitkid,有符号整数通常存储在 2's complement 中。 , 其中 Most Significant Bit (MSB)将确定一个数字是否为负数。

例如在您的示例中,字节 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的下一个幂,与所有低位相同

10100100 可以表示:

4 + 32 + 128 
= 164

(同样,2 的幂,从右到左,省略 0 2 的幂)

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

–2147483648 to 2147483647

而无符号的 32 位整数可以表示来自

0 to 4294967295

关于c - 如何知道二进制整数是否代表负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794653/

相关文章:

c - MPI-- 进程的逻辑循环

c - 遍历 C 数组

python - 如何使用 Python 从二进制代码创建 PDF 文件?

c# - 如何使用 C# 计算整数的二进制表示中的尾随零

assembly - 在 MIPS 中,什么是 HI 和 LO

c - GLib 中的哈希表有何用处?

c - 对主要错误的 undefined reference

assembly - 比较两个二进制文件

concurrency - 如何证明并发对象可线性化?

delphi - Delphi中asm程序结束时要恢复哪些CPU寄存器