首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的Tilde算子

C中的Tilde算子
EN

Stack Overflow用户
提问于 2014-11-25 14:23:02
回答 3查看 847关注 0票数 4
代码语言:javascript
复制
 unsigned short int i = 0;
 printf("%u\n",~i);

为什么这段代码在控制台中返回一个32位数字?它应该是16位,因为短是两个字节。

产出为4,294,967,295,应为65,535。

EN

回答 3

Stack Overflow用户

发布于 2014-11-25 14:27:40

当您将一个参数传递给printf,且该参数的整数类型比int短时,它将根据K&R参数提升规则隐式地提升到int。因此,您的printf-call实际上表现为:

代码语言:javascript
复制
printf("%u\n", (int)~i);

请注意,这是未定义的行为,因为您告诉printf参数具有unsigned类型,而int实际上是有符号的类型。将i转换为unsigned short,然后转换为unsigned以解决未定义的行为和问题:

代码语言:javascript
复制
printf("%u\n", (unsigned)(unsigned short)~i);
票数 4
EN

Stack Overflow用户

发布于 2014-11-25 14:41:02

N1570 6.5.3.3一元算术运算符p4:

~运算符的结果是其(提升)操作数的位补(也就是说,结果中的每个位都是当且仅当转换后的操作数中的对应位没有设置)。整数提升在操作数上执行,结果具有提升类型。.

小于int的整数类型被提升为int。如果是sizeof(unsigned short) == 2sizeof(int) == 4,则结果类型是int

而且,printf转换说明符%u需要unsigned int,因此int的表示被解释为unsigned int。你基本上是在对编译器撒谎,这是未定义的行为。

票数 4
EN

Stack Overflow用户

发布于 2014-11-25 14:29:14

这是因为printf()的参数是以文字形式放入堆栈中的,因为printf内部没有办法知道参数是短的。另外,通过使用%u格式,您只是在声明您正在传递一个无符号数字。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27129184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档