否定C中的字符

cdu*_*mmy 5 c

这是未定义的行为吗?它打印-128为结果:

#include<stdio.h>
int main()
{
    char i=-128;
    i=-i;
    printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)

请解释.

Fre*_*son 8

8位带符号值中-128的二进制补码为-128.

看一下二进制值:

原值:10000000

补充:01111111

增量:10000000

  • C不保证结果为`-128`见C99中的6.3.1.3p3. (4认同)
  • @EitanT查看Two's Complement的定义. (3认同)
  • @EitanT:两个补码是补码和增量.只是一个补充是一个补充. (2认同)

Jef*_*ins 0

您正在使用签名字符。有符号正单字节的最大值是 127。通过对 -128 求反来尝试得到 +128,最终会溢出到 -128。此行为很可能取决于操作系统和编译器。