【问题标题】:c why does this print a negative number?c 为什么这会打印一个负数?
【发布时间】:2010-12-02 07:42:45
【问题描述】:

我原以为这会打印一个非常大的数字和相同的数字 -1,但它只打印 -1 和 -2,这是为什么呢?

fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);

【问题讨论】:

    标签: c hex


    【解决方案1】:

    %d 格式是有符号整数(十进制)。整数使用two's complement存储,这意味着高位(8000 0000)在某种程度上表示值的符号。

    从 3 开始倒数,值为:

    0000 0003 = 3
    0000 0002 = 2
    0000 0001 = 1
    0000 0000 = 0
    FFFF FFFF = -1
    FFFF FFFE = -2
    

    等等

    如果您希望 FFFF FFFF 显示为较大的正数,请使用 %u(无符号)格式。

    【讨论】:

    • 哦,长的百分比是多少?还是未签名?
    • %u - 刚刚添加到响应中:)
    • int 是 %d,unsigned 是 %u,long int 是 %ld,long unsigned 是 %lu
    • 不,%d 表示有符号十进制,%u 表示无符号十进制。
    • % 只是表示“某物”将被放在那里。例如 %.02f 是完全合法的,将打印小数点后 2 位的浮点数,如果没有后小数点数字将打印 2 个 0。
    【解决方案2】:

    参数“%d”将输入打印为有符号整数。结果,您发现了two's complement representation,请考虑改为“%u”。

    【讨论】:

      【解决方案3】:

      有符号整数的第一位是符号,因此可以存储的最大数字是 0xEFFFFFFF。

      【讨论】:

        【解决方案4】:

        您提到的值是-1和-2的二进制补码表示

        查找two's complement

        【讨论】:

          猜你喜欢
          • 2022-12-18
          • 1970-01-01
          • 2017-10-14
          • 2020-05-19
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 2021-12-08
          相关资源
          最近更新 更多