我对无符号字符有好奇心。我对无符号字符有好奇心。我偶然对unsigned char进行了减法运算。我知道我不应该那样做。但是我对某个特定答案的出现有点好奇。有人可以在比特级解释这个吗?无符号字符减法运算
unsigned char x = 150;
unsigned char y = 229;
unsigned char z = x - y;
我终于我在Visual Studio 2008年
我对无符号字符有好奇心。我对无符号字符有好奇心。我偶然对unsigned char进行了减法运算。我知道我不应该那样做。但是我对某个特定答案的出现有点好奇。有人可以在比特级解释这个吗?无符号字符减法运算
unsigned char x = 150;
unsigned char y = 229;
unsigned char z = x - y;
我终于我在Visual Studio 2008年
无符号整数,声明无符号,应当服从算术模2^n,其中n是整数的特定大小的值表示比特的数量 的法律。
(C++ 11标准,3.9.1.5)
在大多数平台的unsigned char
为8位,所以结果是150 - 229 256 MOD =模-79 256 = 177
是的,如果你从150
减去229
,你最终-79
运行该代码的调试
过程中得到了177针对z。但是,由于目标位置限制在0..255
(假设为8位)范围内,因此它会环绕以确保范围得到维护。因此,您基本上添加256
到-79
以177
结束。
换句话说,9 - 10
这将使你在一个符号值-1
,其实是给予你255
为8位unsigned char
。同样,9 - 11
会给你254
。
它以另外没有什么不同,与255 + 7
给你6
因为它回到0
以下255
。
现在,规则是一个小比这更复杂,只要值可以提升到更大的数据类型,然后减法完成,然后结果截断。但数学上,第一段是正确的。
你的推理只适用于'z'类型是'unsigned char'的情况。最后一部分是完全错误的,算术运算符的操作数要在执行算术运算之前进行整体提升*。 [这是一个例子](http://coliru.stacked-crooked.com/a/929ac351d5f62e99)这是如何工作的。 – Praetorian
事实证明,'z'毕竟是'unsigned char',所以你的答案的第一部分是正确的。最后一段还是错的,因为整体提升还是适用的。算术运算符不能在小于'int'的任何地方操作。在实践中,编译器可能会看到结果被放入'unsigned char'中,并且假设操作对'char'更有效,则不执行促销。 – Praetorian
你确定'z'的类型是'int',而不是代码中的'unsigned char'?如果是的话,请发布一个完整和可编辑的例子来重现结果。 – Praetorian
对不起,它是无符号字符。 – Varo