a+b 和 char 类型的值
Posted
技术标签:
【中文标题】a+b 和 char 类型的值【英文标题】:Value of a+b and char type 【发布时间】:2016-04-27 11:34:49 【问题描述】:我正在使用 C++ 工作,并且我(作为练习)在纸上写了 2 个答案。 第一个问题:如果我们有以下变量的声明和初始化:
unsigned char x=250, z=x+7, a='8';
表达式的值是多少?
z|(a-'0') // (here | is bitwise disjunction)
我们有无符号字符,所以数字z=x+7
减少了 256,因此,将数字写入二进制后,答案是 9。
下一个问题:a和b是int变量,a=1
和b=32767
。
int 的范围是[-32768, 32767]
。我们这里没有无符号类型。我的问题是:a+b
的价值是多少?如果某个变量的值大于该数据类型的范围,这如何处理有符号数据类型?
【问题讨论】:
你认为a+b的价值是什么? -32768 但我想看看这实际上是如何工作的。 "这里 | 是按位析取" - 是的,我们知道 其实只有一个问题。我解决了第一个并解释了我解决它的方式。第一个问题只是为了解释我的挣扎。 第一个问题和第二个问题有什么关系?我真的很困惑。 【参考方案1】:下一个问题:a和b是int变量,
a=1
和b=32767
。[...]我的问题是:
a+b
的值是多少?
它的undefined behavior。我们不能告诉你它会是什么。我们可以做出合理的猜测,但就 C++ 而言,有符号整数溢出是未定义的行为。
【讨论】:
未定义的行为或定义的实现?我的意思是这里描述的区别:***.com/questions/2397984/… @user6261180 没问题。它有点短,但我不想解释发生了什么,因为它可能不会发生在每个人身上。【参考方案2】:C++ 中没有operator+(unsigned char, unsigned char)
,它首先将这些unsigned char
参数提升为int
,然后才进行加法,因此表达式的类型为int
。
然后,int
的值太大而无法容纳在 unsigned char
中,然后转换为 unsigned char
。
标准说:
整数类型的纯右值可以转换为另一种整数类型的纯右值。无作用域枚举类型的纯右值可以转换为整数类型的纯右值。如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(模 2**n 其中 n 是用于表示无符号类型的位数)。 [ 注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。 ——尾注]
【讨论】:
【参考方案3】:第二个问题,答案未定。
你可以像这样自己验证:
#include <iostream>
using namespace std;
int main()
int a = 1;
int b = 32767;
int c = a+b;
cout << c << endl;
结果将取决于您的机器。
【讨论】:
int
的范围可以是 [-32768, 32767]。
对于第二个问题,答案确实是-32768它可能在你的机器和OP的机器上,但在C++中它是UB。你不能说它永远是-32768以上是关于a+b 和 char 类型的值的主要内容,如果未能解决你的问题,请参考以下文章
一道int和unsigned char之间强制类型转换的题目