首页 文章

intmax_t文字的后缀

提问于
浏览
1

似乎没有'J'后缀(la printf的%jd) .

那么,是否可以保证 LLULL 后缀可以与intmax_t和uintmax_t类型一起使用?

#include <stdint.h>

intmax_t yuuge = 123456789101112131411516LL;

或者是否有可能存在对于 LL 后缀来说太大的文字?比如说,一个(假设的)系统,32位int,32位长,64位长,128位intmax_t .

2 回答

  • 2

    可能存在对LL后缀来说太大的文字

    是的,如果整数常量超出 (u)intmax_t 的范围,则它太大,有或没有 LL .

    有关类似问题,请参阅Assigning 128 bit integer in C .


    LLLLU 不适用于类型 . 它们用于整数常量 .

    LLL 确保常量的最小类型 . intmax_t 没有后缀 .

    123 is an `int`
    123L is a `long`
    123LL is a `long long`
    123456789012345 is a `long long` on OP's hypothetical system even without LL
    

    intmax_t 可能与 long long 具有相同的范围 - 或者它可能更宽 . intmax_tlong long 都至少为64位 .

    启用警报启用编译器后,如果常量超过 intmax_t 范围,则会发出警告 . 例子:

    //  warning: integer overflow in expression
    intmax_t yuuge1 = (intmax_t)123456*1000000000000000000 + 789101112131411516;
    
    //  warning: overflow in implicit constant conversion [-Woverflow]
    intmax_t yuuge2 = 123456789101112131411516;
    

    C为最大宽度的整数常量提供宏

    以下宏扩展为整数常量表达式,其值由其参数和类型intmax_t指定:C11§7.20.4.21 INTMAX_C(value)


    INTMAX_C(value) 确实有一个限制

    这些宏的任何实例中的参数都应该是一个非整数的常量...,其值不超过相应类型的限制 .

    在具有64位 intmax_t 的计算机上,以下内容不符合该要求 .

    // Not so portable code
    intmax_t yuuge = INTMAX_C(123456789101112131411516);
    

    # 预处理也仅限于 intmax_t .

    尝试在 (u)int64_t 范围之外创建常量的代码很容易出现可移植性问题 . 为了便于携带,建议采用另一种编码方法(避免使用如此大的常量) .


  • 6

    No suffix is needed 如果您只是想要忠实地表达 Value . C语言自动为整数文字提供正确的类型 . 仅当您希望强制文字具有比其自然具有的更高等级类型时才需要后缀(例如 1UL 将值1作为 unsigned long 而不是 int ,或 -1UL 作为 ULONG_MAX 的替代表达式) .

    如果您确实要强制文字具有类型 intmax_t ,请使用 stdint.h 中的 INTMAX_C() 宏 .

相关问题