安全地添加,减去无符号字符

nbu*_*bis 0 c++ unsigned integer-arithmetic

假设一个有8个无符号字符x1,x2,...x8,我们想要计算:

abs((x1 + x2 + x3 + x4) - (x5 + x6 + x7 + x8)) / 4
Run Code Online (Sandbox Code Playgroud)

在不引入大量上溢或下溢错误的情况下,确保最准确结果的最佳方法是什么?

我在模板类中使用它,这就是为什么我不能将无符号值转换为有符号值.

Mar*_*ork 7

operator +方式只适用于int大.因此,当您将其与类型的对象char(小于int)一起使用时,这些值会在操作发生之前自动转换为int.

从而

abs((x1 + x2 + x3 + x4) - (x5 + x6 + x7 + x8)) / 4
Run Code Online (Sandbox Code Playgroud)

由编译器转换为:

abs((static_cast<int>(x1) + static_cast<int>(x2) + static_cast<int>(x3) + static_cast<int>(x4)) - 
    (static_cast<int>(x5) + static_cast<int>(x6) + static_cast<int>(x7) + static_cast<int>(x8))) / 4
Run Code Online (Sandbox Code Playgroud)

因此,除非你加起来很多char,否则你不可能溢出.

将结果分配回来存在问题unsigned char.如果表达式的结果为负,那么您将获得一个使值为正(但定义良好)的转换.