你能告诉我一个数字之后的'u'到底是什么,例如:
#define NAME_DEFINE 1u
答案 0 :(得分:36)
C代码中的1
等整数文字总是int
类型。 int
与signed int
相同。一个将u
或U
(等效)添加到文字中以确保它是unsigned int,以防止各种意外错误和奇怪的行为。
此类错误的一个例子:
在16位机器上,int为16位,此表达式将产生负值:
long x = 30000 + 30000;
30000个文字都是int,因为两个操作数都是int,结果将是int。 16位signed int只能包含最多32767的值,因此会溢出。 x
会因此而得到一个奇怪的负值,而不是预期的60000。
代码
long x = 30000u + 30000u;
然而,将按预期行事。
答案 1 :(得分:15)
这是一种定义无符号文字整数常量的方法。
答案 2 :(得分:3)
这是一种告诉编译器常量1用作无符号整数的方法。一些编译器假设没有像'u'这样的后缀的任何数字都是int类型。为避免这种混淆,建议在将常量用作无符号整数时使用类似'u'的后缀。其他类似的后缀也存在。例如,使用float'f'。
答案 3 :(得分:2)
它表示“unsigned int”,基本上它的功能类似于强制转换,以确保在编译时将数字常量转换为适当的类型。
答案 4 :(得分:0)
代码中的十进制文字(八进制和十六进制文字的规则不同,请参阅 https://en.cppreference.com/w/c/language/integer_constant)具有 int
、long
或 long long
类型之一。从这些中,编译器必须选择足够大的最小类型来保存值。请注意,不考虑类型 char
、signed char
和 short
。例如:
0 // this is a zero of type int
32767 // type int
32768 // could be int or long: On systems with 16 bit integers
// the type will be long, because the value does not fit in an int there.
如果给这样的数字添加一个 u
后缀(大写的 U
也可以),编译器将不得不从 unsigned int
、{{1 }} 和 unsigned long
。例如:
unsigned long long
最后一个例子可用于显示与演员表的区别:
0u // a zero of type unsigned int
32768u // type unsigned int: always fits into an unsigned int
100000u // unsigned int or unsigned long
附带说明:在某些情况下,添加 100000u // always 100000, but may be unsigned int or unsigned long
(unsigned int)100000 // always unsigned int, but not always 100000
// (e.g. if int has only 16 bit)
后缀是确保计算正确性的正确做法,正如 Lundin 的回答所示。但是,也有一些编码指南严格禁止混合有符号和无符号类型,甚至以下语句
u
被归类为不合格,必须写成
unsigned int x = 0;
这可能导致这样一种情况:经常处理无符号值的开发人员养成了在任何地方为文字添加 unsigned int x = 0u;
后缀的习惯。但是,请注意,改变符号会导致在各种情况下的不同行为,例如:
u
可以(取决于 x 的类型)意味着不同于
(x > 0)
幸运的是,编译器/代码检查器通常会就可疑情况向您发出警告。不过,添加 (x > 0u)
后缀时应考虑。