【发布时间】:2012-07-07 11:50:32
【问题描述】:
我花了一些时间研究标准参考资料,但我无法找到以下问题的答案:
- 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 下面的示例不符合标准。如果子范围可能是无符号的整个范围,那么它们就是。
【问题讨论】:
-
在 C 中,您可以保证固定大小的类型
intN_tresp。uintN_t。不幸的是,我们不保证会提供它们。