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

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

【问题讨论】:

认为a+b的价值是什么? -32768 但我想看看这实际上是如何工作的。 "这里 | 是按位析取" - 是的,我们知道 其实只有一个问题。我解决了第一个并解释了我解决它的方式。第一个问题只是为了解释我的挣扎。 第一个问题和第二个问题有什么关系?我真的很困惑。 【参考方案1】:

下一个问题:a和b是int变量,a=1b=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之间强制类型转换的题目

DELPHI中byte类型和char类型区别?

const

C++怎么将 CString 转换成 unsigned char 的数组

怎么将bool类型的值转换为char类型的值

变量的数据类型的转换