在c中为char变量赋值128

0 c signed char

输出是32位2的128补码,即4294967168.如何?

#include <stdio.h>
int main()
{
    char a;
    a=128;
    if(a==-128)
    {
        printf("%u\n",a);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

438*_*427 6

在打开警告的情况下编译代码可以:

warning: overflow in conversion from 'int' to 'char' changes value from '128' to '-128' [-Woverflow]
Run Code Online (Sandbox Code Playgroud)

它告诉你,a=128;你的平台上的作业没有明确定义.

标准说:

6.3.1.3有符号和无符号整数

1当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.

2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.

3否则,新类型已签名且值无法在其中表示; 结果是实现定义或实现定义信号被引发.

因此,我们无法知道发生了什么,因为它取决于您的系统.

但是,如果我们做一些猜测(并注意这只是猜测):

128为8位将为0b1000.0000

因此,当您致电printf转换到的int地方时,会有一个符号扩展名,例如:

 0b1000.0000 ==> 0b1111.1111.1111.1111.1111.1111.1000.0000
Run Code Online (Sandbox Code Playgroud)

其中 - 打印为无符号代表编号4294967168