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

Lod*_*art 25 c

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

#define NAME_DEFINE 1u 
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 42

1C代码中的整数文字总是类型int.int是一样的signed int.一个添加uU(等效)文字,以确保它是unsigned int,以防止各种意外的错误和奇怪的行为.

这种错误的一个例子:

在16位机器上,int为16位,此表达式将导致负值:

long x = 30000 + 30000;
Run Code Online (Sandbox Code Playgroud)

30000个文字都是int,因为两个操作数都是int,结果将是int.16位signed int只能包含最多32767的值,因此会溢出.x因此会得到一个奇怪的负值,而不是预期的60000.

代码

long x = 30000u + 30000u;
Run Code Online (Sandbox Code Playgroud)

但是会按预期行事.

  • 整数溢出未定义的事实不仅仅是理论上的.即使在现实世界中,编译器也会利用整数溢出作为未定义的行为来执行优化.例如,`gcc`至少有20个案例,它不考虑整数溢出来包装,因此它可以执行优化.一个简单的例子是像'a - 8 <42`这样的表达式,如果`a`是带符号的类型`gcc`可以将表达式减少到'a <50`. (5认同)
  • “此表达式将导致负值”。好吧,因为整数溢出是未定义的行为,所以恶魔会从你的鼻子里飞出来。 (3认同)
  • @ouah理论上是的.在现实世界中,我见过的所有编译器都以相同的方式处理整数溢出.无论如何,无论结果如何,它都是一个bug. (3认同)

Bas*_*tch 16

这是一种定义无符号文字整数常量的方法.


Moc*_*cha 5

这是告诉编译器常量 1 应该用作无符号整数的一种方式。一些编译器假设任何没有后缀(如“u”)的数字都是 int 类型。为了避免这种混淆,建议在使用常量作为无符号整数时使用“u”等后缀。还存在其他类似的后缀。例如,对于浮点数,使用“f”。

  • @Lundin 不完全正确,它也可以是很长或很长。如果没有后缀,整数文字的类型是可以保存值(如果有)的“int”、“long”和“long long”中的第一个类型。 (3认同)