What does 'u' mean after a number?
你能告诉我数字后面的" u"到底是什么意思吗?
像C语言中的1这样的整数文字始终为int类型。 int与signed int相同。可以在文字上添加u或u(等效),以确保其为unsigned int,以防止出现各种意外的错误和奇怪的行为。
此类错误的一个示例:
在int为16位的16位计算机上,此表达式将得出负值:
两个30000文字均是int,并且由于两个操作数都是int,所以结果将是int。一个16位带符号的int最多只能包含32767的值,因此它将溢出。因此,x将获得一个奇怪的负值,而不是预期的60000。
代码
1
| long x = 30000u + 30000u; |
但是将表现出预期的效果。
-
this expression will result in a negative value。好吧,因为整数溢出是未定义的行为,所以恶魔会从你的鼻子里飞出来。
-
@ouah理论上是。在现实世界中,我见过的所有编译器都以相同的方式处理整数溢出。无论如何,这都是一个错误,无论结果如何。
-
未定义整数溢出的事实不仅是理论上的。即使在现实世界中,编译器也利用整数溢出(未定义的行为)来进行优化。例如,gcc至少有20种情况不考虑整数溢出进行包装,因此可以执行优化。一个简单的示例是类似于a - 8 < 42的表达式,如果a是带符号的类型gcc,则可以将该表达式简化为a < 50。
-
回复@ouahs评论:定义了未签名的溢出,未定义未签名的溢出。看到:这个SO问题
-
C术语中的@svec整数溢出是未定义的行为,因为只有有符号整数可以溢出。请参见C11,3.4.3p3"未定义行为的示例是整数溢出时的行为"和6.2.5p7"涉及无符号操作数的计算永远不会溢出,[...]"
-
@Lundin我为此得到正确的结果:signed long long var3 = 2147483648 + 2;在这种情况下,RHS中的两个操作数都是int,结果是int,必须溢出吗?但是结果是2147483650。
-
@Rajesh Integer文字根据数字的大小具有不同的类型。但是,您应该劫持一个已有5年历史的问题评论字段,而不是通过单击"提出问题"来提出一个新问题。
这是定义无符号文字整数常量的一种方法。
这是一种告诉编译器常数1用作无符号整数的方式。一些编译器假定没有后缀(如" u")的任何数字均为int类型。为避免这种混淆,在将常量用作无符号整数时,建议使用类似" u"的后缀。也存在其他类似的后缀。例如,对于浮点数'f'使用。
-
不是"某些编译器"。所有编译器。
-
我不想一概而论,因为我个人只使用了几个编译器。
-
我的观点是,C标准强制编译器将不带u的整数文字视为带符号的int。
-
@Lundin不完全正确,它也可以很长或很长。不带后缀的整数文字类型是int,long和long long的第一个,它们可以保存值(如果有)。
-
@DanielFischer:是的。但是,除非您编写u,否则它将始终是带符号的类型。
它的意思是" unsigned int",基本上它的作用类似于强制转换,以确保在编译时将数字常量转换为适当的类型。
-
它没有转换,已经是类型unsigned int。
-
是的,但是H2CO3说"它的功能像演员表",他没有说这是演员表!
-
我的意思是,如果没有" u",它将被签名,这就是整数常量的默认值。因此,tge u是通知编译器将其视为未签名的。我知道这不是演员,只是一个更好理解的样本。