对unsigned char的减法运算

时间:2014-01-29 04:18:46

标签: c++ visual-studio-2008 subtraction unsigned-char

我对unsigned char有好奇心。我对unsigned char有好奇心。我无意中对unsigned char进行了减法操作。我知道我不应该这样做。但我对特定答案的来源有点好奇。任何人都可以在比特级解释这个吗?

unsigned char x = 150;
unsigned char y = 229;

unsigned char z = x - y;

最后我在调试期间得到了177 for z

我在visual studio 2008中运行此代码。

2 个答案:

答案 0 :(得分:4)

  

无符号整数,声明无符号整数,应遵守算术模2 ^ n的定律,其中n是数字   特定大小整数的值表示中的位数。

(C ++ 11标准,3.9.1.5)

在大多数平台上,unsigned char为8位,因此结果为150 - 229 mod 256 = -79 mod 256 = 177。

答案 1 :(得分:1)

是的,如果您从229中减去150,则最终会得到-79。但是,由于目的地限制范围0..255(假设为8位),因此它会回绕以确保维持范围。因此,您基本上将256添加到-79,最终得到177

换句话说,9 - 10会在签名值中为您提供-1,实际上会为{8} 255提供unsigned char。同样,9 - 11会为您提供254

添加没有什么不同,255 + 7给你6,因为它在0之后回到255

现在,规则比 little 更复杂,因为可以将值提升为更大的数据类型,然后完成减法,然后截断结果。但在数学上,第一段是正确的。