2014-01-29 99 views
0

我对无符号字符有好奇心。我对无符号字符有好奇心。我偶然对unsigned char进行了减法运算。我知道我不应该那样做。但是我对某个特定答案的出现有点好奇。有人可以在比特级解释这个吗?无符号字符减法运算

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

unsigned char z = x - y; 

我终于我在Visual Studio 2008年

+2

你确定'z'的类型是'int',而不是代码中的'unsigned char'?如果是的话,请发布一个完整和可编辑的例子来重现结果。 – Praetorian

+0

对不起,它是无符号字符。 – Varo

回答

4

无符号整数,声明无符号,应当服从算术模2^n,其中n是整数的特定大小的值表示比特的数量 的法律。

(C++ 11标准,3.9.1.5)

在大多数平台的unsigned char为8位,所以结果是150 - 229 256 MOD =模-79 256 = 177

1

是的,如果你从150减去229,你最终-79运行该代码的调试

过程中得到了177针对z。但是,由于目标位置限制在0..255(假设为8位)范围内,因此它会环绕以确保范围得到维护。因此,您基本上添加256-79177结束。

换句话说,9 - 10这将使你在一个符号值-1,其实是给予你255为8位unsigned char。同样,9 - 11会给你254

它以另外没有什么不同,与255 + 7给你6因为它回到0以下255

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

+1

你的推理只适用于'z'类型是'unsigned char'的情况。最后一部分是完全错误的,算术运算符的操作数要在执行算术运算之前进行整体提升*。 [这是一个例子](http://coliru.stacked-crooked.com/a/929ac351d5f62e99)这是如何工作的。 – Praetorian

+1

事实证明,'z'毕竟是'unsigned char',所以你的答案的第一部分是正确的。最后一段还是错的,因为整体提升还是适用的。算术运算符不能在小于'int'的任何地方操作。在实践中,编译器可能会看到结果被放入'unsigned char'中,并且假设操作对'char'更有效,则不执行促销。 – Praetorian