intmax_t文字

时间:2018-04-12 16:16:58

标签: c literals

似乎没有'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 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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范围之外创建常量的代码很容易出现可移植性问题。为了便于携带,建议采用另一种编码方法(避免使用如此大的常量)。