a是带符号的int并且包含-100 b是unsigned int并且包含500
a<b returns FALSE!!
Run Code Online (Sandbox Code Playgroud)
为什么到地球?:P
我可以将b转换为signed int并获得正确的结果,但是保持原样而不是结果让我感到惊讶,因为我不知道为什么-100 <500应该是假的,就像编译器转换为无符号类型一样自动(这显然不是程序员要求的).
如果我们保持原样,即第一个签名和第二个未签名,那么为什么要这样做
这真的很混乱.
现在我必须纠正我的所有代码,寻找有符号和无符号整数之间的比较,并将这两个变量转换为我的意思.: - /
在混合有符号和无符号类型时,我还需要注意其他任何情况吗?
请不要回答显而易见的"一般情况下使用无符号类型是不可取的,为什么不坚持只使用签名类型?你会更安全".谢谢.
干杯.
根据整数提升的规则,当您对具有相同位数的有符号和无符号数执行操作时,有符号数将转换为无符号.
看一下这两个数字的二进制表示.当a重新解释为无符号时,它变为4294967196 10:
a = -100 10变为11111111111111111111111110011100
b = + 500 10变为00000000000000000000000111110100
如您所见,a比b两个数字都被解释为无符号时更大.
在混合有符号和无符号类型时,我还需要注意其他任何情况吗?
这个问题的答案是响亮的"是" - 当你混合使用有符号和无符号类型时,你应该非常小心.这就是为什么当有符号和无符号类型混合在同一表达式中时,C++编译器会发出警告的原因.解决所有这些警告很重要,主要是因为它可以帮助您了解自己的程序.
你为什么不坚持只签名类型?
这不是一个好建议 - 你需要无符号类型的情况,因为你的程序模型不能为负的现实项,或者因为你使用整数类型存储位模式的能力 - 例如,表示小集的一个子集.无符号类型本身对您的程序来说并不坏,只要您避免将它们与负数混合,或者在需要进行混合时提供显式转换.