首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁能解释一下这个答案是如何计算出来的?

谁能解释一下这个答案是如何计算出来的?
EN

Stack Overflow用户
提问于 2021-04-04 17:39:11
回答 1查看 79关注 0票数 0
代码语言:javascript
复制
#include<stdio.h>
int main()
{
   printf("%x", -1<<1);
   getchar();
   return 0;
}

输出:输出依赖于编译器。对于32位编译器,它将是fffffffe,而对于16位编译器,它将是fffe。

这是极客写给极客的

EN

回答 1

Stack Overflow用户

发布于 2021-04-04 21:08:41

-1是一个带符号的整数。根据C语言的正式定义,带负值的有符号整数的左移具有undefined behavior。这是一般规则的一部分,即签名操作在溢出时具有未定义的行为。符号位已设置,它必须移位,但没有空间可供其移动,因此它会溢出。

在实践中,几乎所有平台都对有符号整数使用two's complement表示,有符号整数的左移被视为内存中包含无符号整数。但是,请注意,编译器有时会利用这是未定义的行为的事实,以令人惊讶的方式进行优化。

-1是全位1,所以左移位删除了最上面的位,并在底部添加了一个0位。结果是二进制形式的111…1110。如果unsigned int是16位类型,则表示十六进制的fffe。如果unsigned int是32位类型,则为fffffffe。当该内存作为带符号的int读取时,无论采用哪种方式,该值都为-2

指定的%x需要unsigned int作为参数。传递该类型的有符号版本是可以的:它被转换为无符号值。转换的结果是2^N -2,其中N是unsigned int中的位数:如上所述,如果为N=16,则为0xfffe,如果为N=32,则为0xfffffffe

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

https://stackoverflow.com/questions/66939835

复制
相关文章

相似问题

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