【发布时间】:2013-12-08 21:44:24
【问题描述】:
根据 POSIX,intmax_t 指定一个有符号整数类型,能够表示任何有符号整数类型的任何值。
在 C99/C11 中 intmax_t 始终与 long long int 大小相同是否正确?
【问题讨论】:
-
C99/C11 定义
intmax_t和long long。为什么语言规范会定义两种总是做完全相同的事情的整数类型?当然,它们可能会有所不同。
根据 POSIX,intmax_t 指定一个有符号整数类型,能够表示任何有符号整数类型的任何值。
在 C99/C11 中 intmax_t 始终与 long long int 大小相同是否正确?
【问题讨论】:
intmax_t 和 long long。为什么语言规范会定义两种总是做完全相同的事情的整数类型?当然,它们可能会有所不同。
没有。 intmax_t 可以是大于long long 的扩展整数类型。我不知道有任何系统将其定义为这样,但您不应在应用程序代码中假设它们是相同的。 (假设它们在操作系统代码中是相同的,如果您的操作系统始终保证这一点可能是可以接受的,但这仍然可能是个坏主意。)
【讨论】:
long long int 是最大可能的整数类型。可以有大于long long int 的整数类型,并且C11 要求它们可以在intmax_t 中表示,但是这会使intmax_t 大于long long int。 @user19192,您的假设是合理的,所以我只需将这些sizeof 检查放入makefile 或构建过程中,以便rare 平台打破您的假设,您'很快就会知道的。
__int128 作为扩展。这是您所说的大于long long 的整数类型的示例吗?如果是,那么我的机器上的long long 和intmax_t 是64 位,而__int128 是128 位似乎很奇怪。
__int128 不是扩展整数类型,因为 inttype_t 必须是最大的有符号整数类型,包括扩展整数类型。从符合程序的角度来看,这只是您应该假装不存在的东西。 :-)
inttype_t 应该是 intmax_t。抱歉 4 年多已经过了 SO 的编辑窗口。
6.2.5 类型告诉我们“扩展的有符号整数类型”:
4 有五种标准的有符号整数类型,指定为signed char、short int、int、long int 和 long long int。 (这些和其他类型可能是 以几种附加方式指定,如 6.7.2 所述。)也可能有 实现定义的扩展有符号整数类型 标准和扩展 有符号整数类型统称为有符号整数类型。 29)
29) 因此,本标准中关于有符号整数类型的任何声明也适用于扩展的 有符号整数类型。
7.18.1.5 最大宽度整数类型说intmax_t 是最大可能的“有符号整数类型”,因此包括扩展的:
1 以下类型指定了一个有符号整数类型,能够表示任何值 任何有符号整数类型:
intmax_t
6.4.4.1 整数常量 然后非常清楚地表明扩展整数类型可能比任何标准整数类型都大:
6 如果一个整数常量不能用其列表中的任何类型表示,它可能有一个 扩展整数类型,如果扩展整数类型可以表示它的值。
【讨论】:
如果long 和long long 具有相同的宽度和表示(它们经常这样做),则可以为intmax_t 选择long。
【讨论】:
long 的大小始终对应于指针的大小。