C 为什么我们要把后缀放在数字文字后面?

C 为什么我们要把后缀放在数字文字后面?,c,C,我非常肯定这个问题已经得到了回答,尽管我没有找到答案。我知道类型转换的规则,比如。即使我们将1(默认情况下为类型signed int)分配给unsigned int变量,类型unsigned int的变量在任何情况下都将具有值if1。换句话说,我为什么要加U后缀,除非是为了避免类型转换(如果我打算将该值主要赋给unsigned ints) 需要精确控制类型时,文字值后缀最为重要。例如,40亿适合无符号32位整数,但不适合有符号整数。因此,如果您这样做,编译器可能会抱怨: printf("%u",

我非常肯定这个问题已经得到了回答,尽管我没有找到答案。我知道类型转换的规则,比如。即使我们将
1
(默认情况下为类型
signed int
)分配给
unsigned int
变量,类型
unsigned int
的变量在任何情况下都将具有值if
1
。换句话说,我为什么要加
U
后缀,除非是为了避免类型转换(如果我打算将该值主要赋给
unsigned int
s)

需要精确控制类型时,文字值后缀最为重要。例如,40亿适合无符号32位整数,但不适合有符号整数。因此,如果您这样做,编译器可能会抱怨:

printf("%u", 4000000000);
警告:格式指定了类型“unsigned int”,但参数的类型为“long”

还可以使用浮点后缀
f
来确保在算术中以这种方式使用值,例如
1f/x
(也可以写入
1./x
1.0/x
)。如果
x
可能是整数类型,但结果是浮点,则这一点很重要。

整数常量不需要后缀与给定值一起存在(除了可以表示为十进制无符号但无符号的值)。诀窍在于常数是什么类型以及如何使用

禁止显示警告,因为整数十进制常量不能显示为带符号的长字符串

                         // pow(2,64) - 1
unsigned long long x1 =  18446744073709551615; // warning
unsigned long long x2 =  18446744073709551615u;// no warning
举个例子

有时,像
1u
这样的简单常量用于类型转换

// The product is the wider of the type of `x` or `unsigned`
x*1u
提供了一个很好的
printf()
示例


后缀
u
u
确保类型是某种无符号整数,如
无符号
或更宽

没有后缀以确保类型已签名。使用十进制常量

后缀
l
l
确保类型至少为
long/无符号long
,而不改变其符号

后缀
ll
ll
确保类型至少为
long-long/无符号long-long
,而不改变其符号

没有后缀以确保类型小于
int/unsigned


没有标准后缀来确保类型为
intmax\u t/uintmax\u t

在32位int编译器上
0xffffff>>1
的结果是什么?什么是
0xFFFFFFFFU>>1
@EugeneSh
0xFFFFFF
是32位整数/无符号编译器上的无符号编译器
0xFFFFFFFFU
也是一个无符号值。你看到了什么不同?这是因为在十六进制格式输入时容易出错吗?@chux你说得对。让我们把它设为
-1>-1
-1U>>1
的对比<代码>0x7FFFFF问题<代码>0x7fffffu没有问题。文字不需要后缀“来匹配”。如果存在这样的类型,则文本的类型总是适合保存该值。@KerrekSB:没错;我重新编写了部分答案,并给出了一个具体的例子,说明了答案的重要性。答案仍然不是“超出所需类型的范围”。如果是这样的话,那你就是运气不好。相反,它是指指定一个不同于默认选择的有符号或最小整数秩(或两者兼有)。@KerrekSB主要是,但并不完全同意适用于
l
ll
,但不适用于
u
。考虑@ CHOX:或拼写它在十六进制:-)除了警告(其动机我不理解),我找不到合理的解释使用后缀类型“U”或“U”。有符号或无符号整数文字不影响结果的位表示。一旦分配给变量,如果该变量被限定为无符号且秩大于或等于,则将执行整数提升。我非常感谢您的努力,尽管(可能是因为我无法正确回答这个问题)我不明白如何将此
u/u
放在整数文本的末尾。究竟为什么会有人这样写:“-1U”?这对我来说没有意义。@Hairi“有符号或无符号整数文字不会影响结果的位表示。”这一点不清楚,C标准肯定不支持。请举例说明你的意思。@Hairi“为什么……写下这样的话:`-1U'?这对我来说没有意义。”vs什么?清楚地陈述一个给定的用法,以获得清晰的答案。
// The product is the wider of the type of `x` or `unsigned`
x*1u