如何解决是否可以将大于 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;
}
您有责任确保不会发生运行时溢出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。