unsigned char下溢运算结果不一致问题咨询
问题原因解析
核心差异来自C++的整数提升规则和运算过程中类型转换的时机不同,下面分别拆解两个变量的计算流程:
先看result2的计算过程
result2的计算分为两步,每一步都直接在unsigned char类型下完成:
- 第一步:
result2 = result2 - 1- result2是unsigned char类型,初始值为0。无符号整数的减法不会产生负数,溢出时会自动绕回类型最大值:
0 - 1等价于255(因为unsigned char通常是8位,最大值为255),赋值后result2的值为255。
- result2是unsigned char类型,初始值为0。无符号整数的减法不会产生负数,溢出时会自动绕回类型最大值:
- 第二步:
result2 = result2 % 8- 计算
255 % 8,255除以8商31余7,结果为7,赋值后result2最终是7。
- 计算
再看result1的计算过程
result1的计算是一步完成的,中间触发了整数提升:
- 在表达式
(result1 - 1) % 8中,C++会先对小于int的整数类型执行整数提升:- result1是unsigned char类型,首先被提升为int类型(值为0);
- 执行
0 - 1得到int类型的-1;
- 计算
-1 % 8:根据C++的取模规则,取模结果的符号与被除数一致,因此-1 % 8的结果是-1(因为-1 = 8 * 0 + (-1)); - 将int类型的
-1赋值给unsigned char类型的result1:- 无符号类型赋值时,会将值对该类型的"最大值+1"取模(即256),
-1 % 256 = 255,因此result1最终的值是255。
- 无符号类型赋值时,会将值对该类型的"最大值+1"取模(即256),
内容的提问来源于stack exchange,提问作者JosF
相关产品推荐
相关产品推荐

