我不知道该怎么称呼这些标志,但我指的是:
#define TEST_DEF 50000U //<- the "U" here
当您不熟悉用于描述问题的术语时,谷歌搜索是徒劳的。
我要做的是使用这些常量定义,并确保该值仅为一定长度,即8位或16位。
我该怎么做呢?它是什么意思?
答案 0 :(得分:5)
对于整数,定义这些后缀的标准部分(ISO / IEC 9899:2011 - 又名C2011或C11)是:
§6.4.4.1整数常量
定义整数后缀的地方:
整数后缀:
unsigned-suffix long-suffix opt
unsigned-suffix long-long-suffix
long-suffix unsigned-suffix opt
long-long-suffix unsigned-suffix optunsigned-suffix:中的一个
u U
long-suffix:中的一个
l L
long-long-suffix:中的一个
ll LL
浮点数的相应后缀为f
,F
,l
和L
(适用于float
和long double
)。< / p>
请注意,使用l
会有所不同,因为它很容易与1
混淆,因此限定符通常用大写字母书写。
如果要创建具有给定大小的整数文字,那么这样做的设施由<stdint.h>
标准化(在C99中添加)。
标题(有条件地)定义固定大小的类型,例如int8_t
和uint16_t
。它(无条件地)提供最小尺寸类型,例如int_least8_t
和uint_least16_t
。如果它不能提供确切的类型(可能因为字大小为36位,因此处理大小为9,18和36),它仍然可以提供最少的类型。
它还提供INT8_C
等宏,以确保参数为int_least8_t
值。
因此,您可以使用:
#include <stdint.h>
#define TEST_DEF UINT16_C(50000)
并保证该值至少为无符号整数的16位,并且格式化/合格。
§7.20.4整数常量的宏
¶1以下类似函数的宏扩展为适合初始化的整数常量 具有与
<stdint.h>
中定义的类型对应的整数类型的对象。每 宏名称对应于7.20.1.2或7.20.1.5中类似的类型名称。¶2这些宏的任何实例中的参数都应该是一个非整数常量(如 在6.4.4.1)中定义,其值不超过相应类型的限制。
¶3其中一个宏的每次调用都应扩展为整数常量表达式 适用于#if预处理指令。表达式的类型应具有 与根据转换的相应类型的表达式相同的类型 整数促销。表达式的值应该是参数的值。
7.20.4.1最小宽度整数常量的宏
¶1宏
INTN_C(value)
将扩展为整数常量表达式 对应于int_leastN_t
类型。宏UINTN_C(value)
将扩展 到对应于类型uint_leastN_t
的整数常量表达式。对于 例如,如果uint_least64_t
是unsigned long long int
类型的名称, 然后UINT64_C(0x123)
可能会扩展为整数常量0x123ULL
。
答案 1 :(得分:4)
C中有五个整数文字后缀:u
,l
,ul
,ll
和ull
。与C中几乎所有其他内容不同,它们不区分大小写;此外,ul
和ull
可分别写为lu
和llu
(但lul
不可接受)。
它们控制常量的类型。他们像这样大致:
literal │ type
────────┼───────────────────────
500 │ int
500u │ unsigned int
500l │ long int
500ul │ unsigned long int
500ll │ long long int
500ull │ unsigned long long int
这只是一个近似值,因为如果常量对于指示的类型来说太大,则会“提升”为更大的类型。对此的规则非常复杂,我不会试图描述它们。 “提升”十六进制和八进制文字的规则与“提升”十进制文字的规则略有不同,它们在C99与C90之间也略有不同,在C ++中也有所不同。
由于促销效果,无法使用这些后缀将常量限制为任何大小。如果您在281474976710656
和int
均为32位宽的系统上编写long
,则常量将被赋予long long
类型,即使您没有说这样做。此外,没有后缀来强制常量具有类型short
和char
。您可以使用[U]INT{8,16,32,64,MAX}_C
中的<stdint.h>
宏来指示 intent ,但这些宏也不会施加任何上限,并且我可以方便地立即获取所有系统(OSX) ,Linux),*INT8_C
和*INT16_C
实际上会生成类型为(unsigned) int
的值。
您的编译器可能,但不是必需的,如果您编写((uint8_t) 512)
或类似的(其中512是类型范围之外的编译时常量值),则发出警告。在C11中您可以使用static_assert
(来自<assert.h>
)强制解决问题但写入可能有点乏味。
答案 2 :(得分:3)
这是一个无符号的文字(U是后缀)。请参阅:http://en.cppreference.com/w/cpp/language/integer_literal