一个数字后你的意思是什么?

时间:2012-01-27 07:01:58

标签: c

你能告诉我一个数字之后的'u'到底是什么,例如:

#define NAME_DEFINE 1u 

5 个答案:

答案 0 :(得分:36)

C代码中的1等整数文字总是int类型。 intsigned int相同。一个将uU(等效)添加到文字中以确保它是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)具有 intlonglong long 类型之一。从这些中,编译器必须选择足够大的最小类型来保存值。请注意,不考虑类型 charsigned charshort。例如:

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) 后缀时应考虑。