【问题标题】:How to present signed int in C?如何在 C 中呈现已签名的 int?
【发布时间】:2012-09-15 01:40:36
【问题描述】:

我是 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,不是我所期望的,知道吗?

【问题讨论】:

  • 按照该逻辑,任何事物中最重要的位都是 1。 9 是 0b1001,但考虑到 int 不是 4 位。把它想象成 0b00000000000000000000000000001001 表示 32 位整数。
  • @MitchWheat,没错,这超出了我的初衷。
  • 您没有考虑 int 在您正在编译的平台上的字节数。看看 sizeof(a) 给你什么。
  • 按您的逻辑,1 应该代表 -1,因为它至少包含一个已设置的位。这听起来合理吗?
  • 维基百科关于二进制补码的文章其实很不错,用来描述这类事情。 wikipedia

标签: c int signed


【解决方案1】:

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

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

 0b00000000000000000000000000001001

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

【讨论】:

  • 谢谢你的回答,完全有道理,但是int a = 0x80000009; 在有符号的十进制表示模式下应该是'-9'?但它给了我-2147483639
  • @yozloy, 0x80000000 将是最小值。然后它会一直计数到 0xFFFFFFFF 为 -1 的点。
  • @yozloy,请注意系统表示字节的不同方式。特别是一个补码与两个补码和字节序。
【解决方案2】:

有几种方法可以用二进制表示有符号数。您正在考虑 sign-and-magnitude,这是 IEEE 浮点格式使用的。如您所述,单精度float 或双精度double 的最高有效位用于表示符号。现代计算机中的整数值以二进制补码表示。二进制补码中可表示的值的范围取决于使用了多少位。使用的位数取决于您的编译器、您正在编译的目标以及您选择的变量类型。一个 8 位二进制补码数可以表示 -128 到 +127 范围内的数字。在C 中,您通常将char 类型用于带符号的8 位值,将int 用于带符号的32 位值,我今天知道的所有处理器都将用二进制补码表示这些。要了解您的系统使用多少字节存储空间来存储int,您可以使用C 中的sizeof 运算符,在大多数系统中int 是4 字节或32 位。在 N 位二进制补码数中,最高有效位(位 N-1)实际上可以用来确定数的符号,但其余位不能解释为幅度。

Wikipedia's article on two's complement

二进制补码的一个有趣事实是,在 N 位中可表示的最大负数在 N 位中没有可表示的正数。换句话说,你不能代表最负值的绝对值。 N位可表示的二进制补码中的最大负值具有最高有效位(位N-1),其余位为0,其值为-pow(2,N-1)。对于 N=8,最负的值为 0x80,值为 -pow(2,8-1),即 -pow(2,7) 或 -128。 8 位二进制补码中可表示的最大正数是 0x7F,最高有效位为“0”,其余位为“1”,即 pow(2,7)-1 或 +127。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2021-12-13
    • 2019-01-09
    • 2017-04-25
    相关资源
    最近更新 更多