繁体   English   中英

a + b和char类型的值

[英]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=1b=32767

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM