我对未签名的查尔很好奇。我对未签名的查尔很好奇。我无意中对未签名的char做了减法手术,我知道我不应该那样做。但我有点好奇一个特别的答案是怎么来的。有人能解释一下这一点吗?
unsigned char x = 150;
unsigned char y = 229;
unsigned char z = x - y;最后,在调试过程中,我得到了177 for z。
我正在visual 2008中运行此代码。
发布于 2014-01-29 04:28:03
声明为无符号整数的无符号整数应遵守算术模2^n的定律,其中n是整数的值表示中的位数。
(C++11标准,3.9.1.5)
在大多数平台上,一个unsigned char是8位,所以结果是150-229 mod 256 = -79 mod 256 = 177。
发布于 2014-01-29 04:26:10
是的,如果你从229中减去150,你就会得到-79。但是,由于目标的原因,您被限制在范围0..255 (假设为8位),因此它封装起来,以确保范围得到维护。因此,您基本上可以将256添加到-79中,以便以177结束。
换句话说,9 - 10给出了一个有符号值的-1,实际上给出了8位unsigned char的255。类似地,9 - 11会给您254。
这与加法没有什么不同,因为255 + 7给了您6,因为它返回到0后面的255。
现在,规则比可以将值提升到更大的数据类型,然后执行减法,然后截断结果的规则要复杂一些。但从数学上讲,第一段是正确的。
https://stackoverflow.com/questions/21421998
复制相似问题