是否可以将大于 255 的 int 值分配给 char?

问题描述

#include <iostream>
using namespace std;

int main(){
    int f = 1;
    int s = 500;
    char d = 256; // This line gives me overflow error 
    char c = s;   // But it does not. 
    cout << d << endl;
    cout << c << endl;
    return 0;
}

为什么我可以将大于 255 的 int 分配给 char,但我不能直接分配大于 255 的整数文字

文字值的直接赋值与使用变量的值赋值有何不同?

解决方法

能否请您发布错误消息和您使用的编译器/编译器版本?

这很可能是一个警告,因为根据标准,行为定义良好,应该编译:

7.3.9 积分转换 [conv.integral]

1 整数类型的纯右值可以转换为 另一种整数类型。无作用域枚举类型的纯右值可以是 转换为整数类型的纯右值。

2 如果目标类型是 bool,请参见 7.3.15。如果源类型是 bool,值 false 被转换为零,值 true 是 转换为 1。

3 否则,结果是目标类型的唯一值 这与源整数模 2^N 一致,其中 N 是 目标类型的宽度。

4 作为积分促销允许的转换不包括在 一组整数转换。

,

是的,可以完成赋值,但是值会不正确,所以不应该完成。

编译时间常数检查

编译器应在编译时执行常量值溢出检查,并提供警告,指出将 256 分配给 d 将导致值被截断。

运行时检查

当值为 500 的 s 分配给 char c 时,不会对这种溢出情况进行运行时检查。即使可以赋值,也会导致 c 成为不正确的值。
这是您的代码的更新版本,显示了不正确的值。

#include<iostream>
using namespace std;
int main() {
   int f = 1;
   int s = 500;
   char d = 256; // This line gives me overflow error 
   char c = s;   // But it does not. 
   cout << d << endl;
   cout << c << endl;
   int s_corrupt = c;
   cout << s_corrupt << endl;
   return 0;
}

您有责任确保不会发生运行时溢出。