似乎没有'J'后缀(la printf的%jd) .
那么,是否可以保证 LL 和 ULL 后缀可以与intmax_t和uintmax_t类型一起使用?
LL
ULL
#include <stdint.h> intmax_t yuuge = 123456789101112131411516LL;
或者是否有可能存在对于 LL 后缀来说太大的文字?比如说,一个(假设的)系统,32位int,32位长,64位长,128位intmax_t .
可能存在对LL后缀来说太大的文字
是的,如果整数常量超出 (u)intmax_t 的范围,则它太大,有或没有 LL .
(u)intmax_t
有关类似问题,请参阅Assigning 128 bit integer in C .
LL 和 LLU 不适用于类型 . 它们用于整数常量 .
LLU
L 或 LL 确保常量的最小类型 . intmax_t 没有后缀 .
L
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_t 和 long long 都至少为64位 .
long long
启用警报启用编译器后,如果常量超过 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) 确实有一个限制
INTMAX_C(value)
这些宏的任何实例中的参数都应该是一个非整数的常量...,其值不超过相应类型的限制 .
在具有64位 intmax_t 的计算机上,以下内容不符合该要求 .
// Not so portable code intmax_t yuuge = INTMAX_C(123456789101112131411516);
# 预处理也仅限于 intmax_t .
#
尝试在 (u)int64_t 范围之外创建常量的代码很容易出现可移植性问题 . 为了便于携带,建议采用另一种编码方法(避免使用如此大的常量) .
(u)int64_t
No suffix is needed 如果您只是想要忠实地表达 Value . C语言自动为整数文字提供正确的类型 . 仅当您希望强制文字具有比其自然具有的更高等级类型时才需要后缀(例如 1UL 将值1作为 unsigned long 而不是 int ,或 -1UL 作为 ULONG_MAX 的替代表达式) .
1UL
unsigned long
int
-1UL
ULONG_MAX
如果您确实要强制文字具有类型 intmax_t ,请使用 stdint.h 中的 INTMAX_C() 宏 .
stdint.h
INTMAX_C()
2 回答
是的,如果整数常量超出
(u)intmax_t
的范围,则它太大,有或没有LL
.有关类似问题,请参阅Assigning 128 bit integer in C .
LL
和LLU
不适用于类型 . 它们用于整数常量 .L
或LL
确保常量的最小类型 .intmax_t
没有后缀 .intmax_t
可能与long long
具有相同的范围 - 或者它可能更宽 .intmax_t
和long long
都至少为64位 .启用警报启用编译器后,如果常量超过
intmax_t
范围,则会发出警告 . 例子:C为最大宽度的整数常量提供宏
INTMAX_C(value)
确实有一个限制在具有64位
intmax_t
的计算机上,以下内容不符合该要求 .#
预处理也仅限于intmax_t
.尝试在
(u)int64_t
范围之外创建常量的代码很容易出现可移植性问题 . 为了便于携带,建议采用另一种编码方法(避免使用如此大的常量) .No suffix is needed 如果您只是想要忠实地表达 Value . C语言自动为整数文字提供正确的类型 . 仅当您希望强制文字具有比其自然具有的更高等级类型时才需要后缀(例如
1UL
将值1作为unsigned long
而不是int
,或-1UL
作为ULONG_MAX
的替代表达式) .如果您确实要强制文字具有类型
intmax_t
,请使用stdint.h
中的INTMAX_C()
宏 .