首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >右位移位将C中无符号整型的开头加1

右位移位将C中无符号整型的开头加1
EN

Stack Overflow用户
提问于 2019-04-10 00:09:45
回答 2查看 160关注 0票数 0

我正在尝试移位一个16位的地址,以便在C中获得一个缓存模拟器的集合ID,但是当我尝试向右移位时,我的数字上多了一个1。

我有0010100010011001的号码。然后我移到左边的3位数,得到0100010011001000。到目前一切尚好。但是,然后我尝试移到正确的6位数,结果是0000010100010011而不是0000000100010011。我所有的int都是无符号的,当我尝试并移位时,它只加1。

我尝试和转换的代码如下所示。在我的例子中,tag_size是3,b是6。

代码语言:javascript
复制
    unsigned int temp = addr << tag_size;
    unsigned int temp1 = temp >> b;
    unsigned int setid = temp1 >> tag_size;
EN

回答 2

Stack Overflow用户

发布于 2019-04-10 00:49:25

如今,16位int并不常见。您可以尝试将变量定义为short,通常为16位。这完全取决于您使用的机器。如果您正在寻找16位整数,您也可以使用uint16

看起来问题可能是因为你正在使用的unsigned int实际上并不是克里斯蒂安·吉本斯在评论中提到的16位。当你将0010100010011001向左移动3位数字时,你最终得到的是10100010011001000,最左边的1并没有像你预期的那样在16位整数中被移除,然后当你再次向右移动时,你得到了你不期望的增加的1。

你可以把你的代码改成这样,它应该会像你最初期望的那样工作:

代码语言:javascript
复制
uint16_t temp = addr << tag_size;
uint16_t temp1 = temp >> b;
uint16_t setid = temp1 >> tag_size;
票数 1
EN

Stack Overflow用户

发布于 2019-04-10 02:02:43

您应该使用掩码并选择您感兴趣的位;例如:

代码语言:javascript
复制
unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int temp1 = temp >> b;
unsigned int setid = temp1 >> tag_size;

如果我明白你想要什么,同样的事情也可以用

代码语言:javascript
复制
unsigned int temp = addr & (0xffffu >> tag_size); // keep 16 low bits
unsigned int setid = temp >> b;

代码语言:javascript
复制
unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int setid = temp >> (b + tag_size);

这使得代码独立于unsigned int大小,C保证至少为16位。

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

https://stackoverflow.com/questions/55597039

复制
相关文章

相似问题

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