首页 > c++缩小转换的时候int变量赋值给char变量重输出时为什么是32?

c++缩小转换的时候int变量赋值给char变量重输出时为什么是32?

#include <iostream>

using namespace std;

int main()
{
    int a = 20000;
    char c = a;
    cout << c << endl;
    int b = c;
    if (a != b)
    {
        cout << b << endl;
        cout << "not equal\n";
    }
    return 0;
}

我想请教一下各位为什么输出b的值会是32啊,我觉得a的值过大,char本身是一个字节嘛,然后char字节的8位应该全部放1啊,那输出应该是-128啊。可是输出b的值是32,书上也说是应该输出32,可是没有解释具体的原因,所以来请教一下各位!谢谢大家


首先你需要去看一本叫D&E的书. 再者, 这个锅应该摔给C语言.
C++在设计的时候就想要去兼容C语言, 所以char和int之间的隐式转换(没有任何编译错误警告)是C带来的. 而一个大于char最大值的int, 转化成char时, 这个行为应该是未定义行为. 具体就不要深究了, 你只需要知道这样写代码是不对的.

PS:
楼上给你的解释, 只是一个特定编译器下的实现, 站在未定义行为的角度看, 不管任何编译器怎么实现, 他都是合法的.
我记得以前写程序用移位操作, 当时并不太清楚用有符号整数会出现什么后果, 结果后来程序在gcc下面跑的很好, 在vc下面就是不行. 直到后来看书, 后来所有的位运算都用uint32_t或者unint64_t.

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.


转换的时候不会全部放1,注意下面
这是 2000 的二进制表示 ‭0100 1110 0010 0000‬
在缩短到 1 bytechar 后,应该是保留后面的 0010 0000‬ , 而这个数十进制表示就是 32

【热门文章】
【热门文章】