a + b和char类型的值

时间:2016-04-27 11:34:50

标签: c++ return-value unsigned-char

我在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=1b=32767

int的范围是[-32768, 32767]。我们这里没有未签名的类型。我的问题是:a+b的价值是多少?如果某个变量的值大于该数据类型的范围,这对签名数据类型如何工作?

3 个答案:

答案 0 :(得分:3)

  

下一个问题:a和b是int变量,a=1b=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

结果取决于您的机器。