我对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中运行此代码。
答案 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 更复杂,因为可以将值提升为更大的数据类型,然后完成减法,然后截断结果。但在数学上,第一段是正确的。