0

所以我试图测试一个超短函数来让我从整数中获取某些位 x 到 y 的整数值,但是在发生符号扩展时遇到了一些问题。我尝试转换为无符号整数,然后使用无符号整数进行转换,但这似乎不起作用。代码如下:

#include <stdio.h>

int main()
{
    int bo_bits = 2;
    int tag_bits = 28;
    int addr = 1;

    unsigned int index = (unsigned int)addr;
    index = index << tag_bits;
    index = index >> bo_bits;

    // at this point I would return (int)index;

    return 0;
}

我不明白为什么会发生符号扩展,因为我只移动了一个无符号整数。我还只使用“addr”运行代码并将其作为无符号整数,但这也没有改变输出。

当我在 linux 机器上运行 gdb 中的函数时,索引的输出值为 536870912,并且在在线编译(现在编码地面)时,我得到的值为 67108864。

编辑:有几个人问我是如何得到值 536870912 的,我已经让它通过两个断点运行 gdb 并p get_index(1)从 gdb 运行命令。实际代码如下:

unsigned int index = (unsigned int)addr;
index = index << tag_bits;
index = index >> bo_bits;
return (int)index;

感谢所有的帮助!

4

1 回答 1

0

536870912 等于 1 << 29,这意味着它与符号扩展无关。

可能是你在调试程序的时候停在了错误的地方

这是 c99 标准关于按位右移的内容。(6.5.7 移位运算符

E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 / 2^E2 的商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。

于 2014-11-29T05:59:32.680 回答