首页 > 解决方案 > 将 128 分配给 c 中的 char 变量

问题描述

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

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

标签: ccharsigned

解决方案


在打开警告的情况下编译代码会给出:

warning: overflow in conversion from 'int' to 'char' changes value from '128' to '-128' [-Woverflow]

它告诉您,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

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


推荐阅读