[英]Value of a+b and char type
我在C ++中工作,并且(作为练习)不得不在纸上写下2个答案。 第一个问题:我们是否具有以下变量的声明和初始化:
unsigned char x=250, z=x+7, a='8';
表达式的价值是什么?
z|(a-'0') // (here | is bitwise disjunction)
我们具有未签名的char,因此将z=x+7
的数字减少为256,因此,在以二进制形式写入数字之后,答案为9。
下一个问题:a和b是int变量, a=1
和b=32767
。
int的范围是[-32768, 32767]
。 我们这里没有未签名的类型。 我的问题是: a+b
的值是多少? 如果某个变量的值大于该数据类型的范围,则如何处理带符号的数据类型?
下一个问题:a和b是int变量,
a=1
和b=32767
。[...]我的问题是:
a+b
的值是多少?
其不确定的行为 。 我们无法告诉您它将是什么。 我们可以做出合理的猜测,但是就C ++而言,有符号整数溢出是未定义的行为。
C ++中没有operator+(unsigned char, unsigned char)
,它首先将这些unsigned char
参数提升为int
,然后再进行加法运算,因此表达式的类型为int
。
然后将该int
以适应其值太大, unsigned char
被转换为unsigned char
。
该标准说:
整数类型的prvalue可以转换为另一种整数类型的prvalue。 可以将无作用域枚举类型的prvalue转换为整数类型的prvalue。 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(取模2 ** n,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有任何变化(如果没有截断)。 —尾注]
对于第二个问题,答案是不确定的。
您可以这样验证自己:
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 32767;
int c = a+b;
cout << c << endl;
}
结果将取决于您的计算机。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.