我非常确定这个问题已得到解答,但我没有设法找到它。我知道类型转换的规则,例如this。即使我们将1
(默认情况下类型为signed int
)分配给unsigned int
变量,unsigned int
类型的变量也将具有值1
在任一情况下。换句话说,为什么我要放U
后缀,除非避免类型转换(如果我打算将该值主要分配给unsigned int
s)?
答案 0 :(得分:1)
当您需要精确控制类型时,字面值后缀是最重要的。例如,40亿符合无符号32位int但不符合签名。因此,如果您这样做,您的编译器可能会抱怨:
printf("%u", 4000000000);
警告:格式指定类型' unsigned int'但是参数的类型为' long'
也可以使用float后缀f
来确保在算术中使用这种方式的值,例如1f / x
(也可以写成1. / x
或1.0 / x
)。如果x
可能是一个整数类型,但结果是浮点数,那么这很重要。
答案 1 :(得分:1)
整数常量不需要具有给定值的后缀(除了可表示为十进制中的一些无符号但未签名的值)。诀窍是什么类型的常量以及如何使用。
取消警告,因为整数十进制常量无法显示为signed long long
。
// pow(2,64) - 1
unsigned long long x1 = 18446744073709551615; // warning
unsigned long long x2 = 18446744073709551615u;// no warning
考虑@Eugene Sh.示例
-1 >> 1 // Rigth shifting negative values is implementation defined behavior
// versus
-1U >> 1 // Well defined. -1U has the positive value of `UINT_MAX`
有时像1u
这样的简单常量用于轻柔类型转换
// The product is the wider of the type of `x` or `unsigned`
x*1u
@John Zwinck提供了一个很好的printf()
示例。
后缀u
和U
确保类型为某些无符号整数,如unsigned
或更宽。
没有后缀来确保类型已签名。使用十进制常量。
后缀l
和L
确保类型至少为long/unsigned long
而不更改其签名。
后缀ll
和LL
确保类型至少为long long/unsigned long long
而不更改其签名。
没有后缀来确保类型比int/unsigned
更窄。
没有标准后缀来确保类型为intmax_t/uintmax_t
。