首页 > 代码库 > 原码、反码、补码
原码、反码、补码
那天被同学问到了C++ Primer下面这一段话的含义:
就是将一个负数赋值给一个无符号数,会发生什么?
其实是一个很简单的问题,关键是书中的 “the remainder of the value modulo the number of values the target type can hold”引起了我理解上的歧义。
这里要先说说取模和取余的区别。详细可以参考这篇文章,取模和取余的不同,以及Stackoverflow的回答:Stackoverflow。
取模和取余的区别关键点还是在于除法定义(整数相除结果要取整的情形)的不同,前者是商向无穷小方向取整,后者是商向零方向取整。
这样导致的结果是,对于商是正数的情况,两种除法定义的商相同,取模和取余的结果自然就相同。
但是当商是负数的情况下,两种除法定义的商就不相同了,然后取模和取余的结果就不同了。取模后的结果符号和除数一致,取余后的结果符号却和被除数一致。
在编程语言中,一般用 % 来表示取模或者取余,但是在一种语言中毫无疑问只能表示一种含义。
但是C++ primer中却这样写道:
我认为这是一种错误的说法,按照书中上下文的理解,在C++中,% 是表示取余的含义,而不能说成 “remainder” or “modulus”,一种语言中只能有一种含义,
而在Python语言中,% 的含义则是取模。
回头来看开头书中那一段话,蓦然发现居然是正确的。-1 mod 256 = 255,而原书中用的就是取模后的余数——“the remainder of the value modulo the number of values the target type can hold”。这也说明取模和取余是有区别的,而此处说成取模是正确的。
再来看最初的这一个问题,当把一个负数赋给一个无符号类型时,会发生什么?
当然很容易总结出来公式可以得到正确的值:例如,无符号类型的最大值 减去(所赋值的绝对值对无符号类型的最大值的余数)。
这个公式也适用于当一个无符号数和一个有符号数运算时,需要先将有符号数转化为无符号数。
但是这里面有一些
原码、反码、补码