【问题标题】:What do i64 and i32 at the end of the values in limits.h mean?limits.h 中值末尾的 i64 和 i32 是什么意思?
【发布时间】:2018-08-25 06:58:33
【问题描述】:

我在 windows 上查看了 limits.h 并发现了这个:

#define LLONG_MAX     9223372036854775807i64       // maximum signed long long int value
#define LLONG_MIN   (-9223372036854775807i64 - 1)  // minimum signed long long int value
#define ULLONG_MAX    0xffffffffffffffffui64       // maximum unsigned long long int value

值末尾的i64是什么意思?

【问题讨论】:

标签: c


【解决方案1】:

i64 后缀是 Microsoft 扩展,用于指定 64 位整数常量。

一个可移植的替代方案是(int64_t)9223372036854775807,但旧版本的 Microsoft C 不支持 C99 <stdint.h> 类型。

您还可以使用标准后缀LL 来指定long long 类型的常量,它至少有63 个值位,但在某些平台上可能更多。 L 的大小写并不重要,所以1ll 等同于1LL,但明显更令人困惑,因为l 看起来很像1,尤其是对于一些固定类型的字体。

请注意,9223372036854775807 作为整数常量具有最小的类型,具有足够的范围以在列表intlong intlong long int 中表达它。鉴于这些类型在 Microsoft 平台上的常见大小,long long int 类型可能是唯一具有 64 位的类型。

后缀对于较小的常量更有用,例如1,如下所示:

uint64_t x = 1 << 32;     // undefined behavior
uint64_t x = 1ULL << 32;  // fully defined, x is 0x800000000
uint64_t x = 1ui64 << 32; // Microsoft specific, non portable

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多