我花了一些时间研究标准参考资料,但我无法找到以下问题的答案:
- C/C++ 标准是否在技术上保证,给定有符号整数类型 S 及其无符号对应物 U,每个可能的 S 的绝对值始终小于或等于 U 的最大值?
我得到的最接近的是来自 C99 标准的第6.2.6.2节(C++ 的措辞对我来说更神秘,我认为它们在这方面是等价的):
对于有符号整数类型,对象表示的位应分为三组:值位、填充位和符号位。(...) 作为值位的每个位应与对应无符号类型的对象表示中的相同位具有相同的值(如果有符号类型中有 M 个值位,无符号类型中有 N 个值位,则 M≤ N)。
那么,在假设的 4 位有符号/无符号整数类型中,是否有任何东西阻止无符号类型具有 1 个填充位和 3 个值位,以及有符号类型具有 3 个值位和 1 个符号位?在这种情况下,无符号的范围是 [0,7],而有符号的范围是 [-8,7](假设二进制补码)。
万一有人好奇,我现在依靠一种技术来提取负整数的绝对值,该技术包括首先转换为无符号对应物,然后应用一元减运算符(例如 - 3 通过强制转换变为 4,然后通过一元减号变为 3)。这将在上面的 -8 示例中中断,无法以无符号类型表示。
编辑:感谢 Keith 和 Potatoswatter 下面的回复。现在,我的最后一点疑问是标准措辞中“子范围”的含义。如果这意味着严格的“小于”包含,那么我上面的示例和 Keith 下面的示例不符合标准。如果子范围可能是无符号的整个范围,那么它们就是。