我在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
的价值是多少?如果某个变量的值大于该数据类型的范围,这对签名数据类型如何工作?
答案 0 :(得分:3)
下一个问题:a和b是int变量,
a=1
和b=32767
。[...]我的问题是:
a+b
的价值是什么?
其undefined behavior。我们不能告诉你它会是什么。我们可以做出合理的猜测,但就C ++而言,有符号整数溢出是未定义的行为。
答案 1 :(得分:1)
C ++中没有operator+(unsigned char, unsigned char)
,它首先将这些unsigned char
参数提升为int
,然后才进行添加,以便表达式的类型为int
然后,int
的值太大而无法容纳unsigned char
的{{1}}转换为unsigned char
。
标准说:
整数类型的prvalue可以转换为另一个整数类型的prvalue。可以将未范围的枚举类型的prvalue转换为整数类型的prvalue。如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(modulo 2 ** n,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 - 结束说明]
答案 2 :(得分:0)
对于第二个问题,答案尚未确定。
您可以自己验证:
Array
结果取决于您的机器。