0

我是 C 新手,这是一个新手问题:

我遇到了这段关于有符号整数表示的代码:

int main(void) {
    int a = 0x8fffffff;
    printf("%d\n",a);
    return 0;
}

它返回-1879048193

我目前对 signed int 的理解是最左边的位用于负或正指示:

所以0x9应该评估为有符号十进制-1,因为它的左侧位是1

int main(void) {
    int a = 0x9;
    printf("%d\n",a);
    return 0;
}

但它给了我小数点 9,不是我所期望的,知道吗?

4

2 回答 2

2

您混淆了表示以及“最左边”(最重要)位的实际含义。当系统在内存中表示一个 int(我将使用 32 位)时,它会占用类型定义的位数,而不是它需要保存该数字的位数。根据变量的类型,它甚至可能需要更多时间才能将其置于良好的起始位置以供以后访问(填充/对齐)。

你的整数可以这样表示,它在最右边的 4 位中具有二进制值 9:

 0b00000000000000000000000000001001

正如你所看到的,最左边的位肯定不是 1。你的 int 可能不是 32 位,但任何超过 4 的东西都会给你同样的故事。做出相同的假设,您可以查看实际设置最高有效位的结果,在我打印 0x80000009 的测试中,结果为 -2147483639。

于 2012-09-15T01:47:38.927 回答
0

有几种方法可以用二进制表示有符号数。您正在考虑sign-and-magnitude,这是 IEEE 浮点格式使用的。如您所述,单精度float或双精度的最高有效位double用于表示符号。现代计算机中的整数值以二进制补码表示。二进制补码中可表示的值的范围取决于使用了多少位。使用的位数取决于您的编译器、您正在编译的目标以及您选择的变量类型。一个 8 位二进制补码数可以表示 -128 到 +127 范围内的数字。在C您通常会将该char类型用于有符号的 8 位值,并且int for a signed 32-bit value, all processors I'm aware of today would represent these in two's complement. To find out how many bytes of storage your system uses to store an int you can use the sizeof operator in C, in most systems an int is 4 bytes, or 32-bits. In an N-bit two's complement number the most significant bit (bit N-1) can, in fact, be used to determine the sign of the number, but the remaining bits are not to be interpreted as the magnitude.

See Wikipedia's article on two's complement.

One interesting fact of two's complement is that the most negative number representable in N bits has no representable positive counterpart in N bits. In other words, you cannot represent the absolute value of the most negative value. The most negative value in two's complement representable in N bits has the most significant bit (bit N-1) set, and the remaining bits 0, its value is -pow(2,N-1). For N=8 the most negative value is 0x80 and the value is -pow(2,8-1) which is -pow(2,7) or -128. The largest positive number representable in two's complement in 8 bits is 0x7F, a '0' in the most significant bit and '1' in the remaining bits, or pow(2,7)-1 or +127.

于 2012-09-15T02:04:25.663 回答