【问题标题】:Is it possible to assign an int value greater than 255 to a char?是否可以将大于 255 的 int 值分配给 char?
【发布时间】:2021-09-12 14:57:38
【问题描述】:
#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 的整数文字?

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

【问题讨论】:

  • 在什么情况下无法将 256 分配给 d?
  • char d=256 可以在编译时诊断,char c=s 将是运行时问题(因为s 不是const(expr))。
  • 您使用的是哪个编译器,您的编译器标志是什么?您从编译器中得到了哪些错误和警告?请添加到您的问题陈述中。我预计会收到一些警告,表明 char 声明存在问题。
  • char 超过 8 位(或超过 9 位,如果被视为有符号)的平台上,int 的值可能超过 255 到 char。否则会出现bit slicing。

标签: c++ char integer c++14 overflow


【解决方案1】:

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

编译时间常数检查

编译器应在编译时执行常量值溢出检查,并提供警告,将 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;
}

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

【讨论】:

    【解决方案2】:

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

    这很可能是一个警告,因为根据标准,该行为已明确定义并且应该可以编译:

    7.3.9 积分转换 [conv.integral]

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

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

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

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

    【讨论】:

    • 注意:2 的有符号补码仅适用于 C++20;问题标记为 C++14。
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2023-03-26
    • 2023-02-22
    • 2012-12-10
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多