【问题标题】:Is intmax_t the same as long long int?intmax_t 和 long long int 一样吗?
【发布时间】:2013-12-08 21:44:24
【问题描述】:

根据 POSIX,intmax_t 指定一个有符号整数类型,能够表示任何有符号整数类型的任何值。

在 C99/C11 中 intmax_t 始终与 long long int 大小相同是否正确?

【问题讨论】:

  • C99/C11 定义intmax_t long long。为什么语言规范会定义两种总是做完全相同的事情的整数类型?当然,它们可能会有所不同。

标签: c posix


【解决方案1】:

没有。 intmax_t 可以是大于long long 的扩展整数类型。我不知道有任何系统将其定义为这样,但您不应在应用程序代码中假设它们是相同的。 (假设它们在操作系统代码中是相同的,如果您的操作系统始终保证这一点可能是可以接受的,但这仍然可能是个坏主意。)

【讨论】:

  • 同意。我在 C11 中看不到任何东西可以保证 long long int 是最大可能的整数类型。可以有大于long long int 的整数类型,并且C11 要求它们可以在intmax_t 中表示,但是这会使intmax_t 大于long long int。 @user19192,您的假设是合理的,所以我只需将这些sizeof 检查放入makefile 或构建过程中,以便rare 平台打破您的假设,您'很快就会知道的。
  • GNU C 具有 128 位整数类型 __int128 作为扩展。这是您所说的大于long long 的整数类型的示例吗?如果是,那么我的机器上的long longintmax_t 是64 位,而__int128 是128 位似乎很奇怪。
  • 形式上,__int128 不是扩展整数类型,因为 inttype_t 必须是最大的有符号整数类型,包括扩展整数类型。从符合程序的角度来看,这只是您应该假装不存在的东西。 :-)
  • inttype_t 应该是 intmax_t。抱歉 4 年多已经过了 SO 的编辑窗口。
【解决方案2】:

C99 N1256 standard draft

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 如果一个整数常量不能用其列表中的任何类型表示,它可能有一个 扩展整数类型,如果扩展整数类型可以表示它的值。

【讨论】:

    【解决方案3】:

    如果longlong long 具有相同的宽度和表示(它们经常这样做),则可以为intmax_t 选择long

    【讨论】:

    • @XTF 该规则适用于 Windows。在 UNIX/Linux 系统上(这两种架构分别称为 x86 和 x86_64),long 的大小始终对应于指针的大小。
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多