【问题标题】:What is -(-128) for signed single byte char in C?C 中带符号单字节字符的 -(-128) 是什么?
【发布时间】:2013-07-02 10:20:08
【问题描述】:

我的小程序:

#include <stdio.h>

int main() {
    signed char c = -128;
    c = -c;
    printf("%d", c);
    return 0;
}

打印:

-128

减号 (-) 运算符是否可跨 CPU 移植?

【问题讨论】:

    标签: c cpu instruction-set


    【解决方案1】:

    注意:2 的补码中的 -128 是 1000 0000 (一个字节),128 也是 1000 0000 。 如果您执行char c = 128 并打印它,它将是-128,原因如下:

    一个 char 变量 = 128 个值存储在内存中,如下所示。

    MSB
    +----+----+----+---+---+---+---+---+
    |  1 |  0 | 0  | 0 | 0 | 0 | 0 | 0 |   
    +----+----+----+---+---+---+---+---+
       7    6   5    4   3   2   1   0  
    

    现在,

    1. 此值将被解释为负值,因为 MSB 为 1,
    2. 打印这个 -ve 数字 2 的补码的大小,也就是 128 在一个字节中,所以输出是:-128

      2 的补码:

        1000 0000
      
        0111 1111  1's complement 
      + 0000 0001 
       -----------
        1000 0000  2's complement   
      
       Magnitude = 128 
       So in one byte 128 == -128
      

    【讨论】:

      【解决方案2】:

      因为一个字节(char)不能容纳 128

      -128 = 0x80
      

      neg 做的是反转它并加 1

      -(-128) = (~0x80) + 1 = 0x7F + 1 = 0x80
      

      daha,你又得到了 0x80

      【讨论】:

        【解决方案3】:

        一元减号的操作数首先经过标准承诺,所以它是int类型,可以表示值-128。操作的结果是值128,也是int 类型。从int 到signed char 的转换是有符号类型的缩小,是实现定义的。

        (您的实现似乎做了一个简单的环绕:125、126、127、-128、-127、...)

        【讨论】:

        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        • 2022-11-27
        相关资源
        最近更新 更多