为什么我们在数字文字后面添加后缀?

时间:2016-10-25 14:23:35

标签: c

我非常确定这个问题已得到解答,但我没有设法找到它。我知道类型转换的规则,例如this。即使我们将1(默认情况下类型为signed int)分配给unsigned int变量,unsigned int类型的变量也将具有值1在任一情况下。换句话说,为什么我要放U后缀,除非避免类型转换(如果我打算将该值主要分配给unsigned int s)?

2 个答案:

答案 0 :(得分:1)

当您需要精确控制类型时,字面值后缀是最重要的。例如,40亿符合无符号32位int但不符合签名。因此,如果您这样做,您的编译器可能会抱怨:

printf("%u", 4000000000);
  

警告:格式指定类型' unsigned int'但是参数的类型为' long'

也可以使用float后缀f来确保在算术中使用这种方式的值,例如1f / x(也可以写成1. / x1.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()示例。

后缀uU确保类型为某些无符号整数,如unsigned或更宽。

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

后缀lL确保类型至少为long/unsigned long而不更改其签名。

后缀llLL确保类型至少为long long/unsigned long long而不更改其签名。

没有后缀来确保类型比int/unsigned更窄。

没有标准后缀来确保类型为intmax_t/uintmax_t