【问题标题】:bit-shifting by an integer value按整数值移位
【发布时间】:2015-06-30 10:51:07
【问题描述】:

此代码用于缓存模拟器项目 - 我正在尝试从内存地址中提取某些位。当我尝试使用 int 变量进行位移时,我得到了不正确的结果,但是当我直接使用数字时,我的结果是正确的。我一直在寻找这个问题的答案,但我找不到。我的问题是什么?

#include <stdio.h>

void main(){

    unsigned long long int mem_addr = 0x7fff5a8487c0;

    int byte_offset_bits = 2;
    int block_offset_bits = 5;
    int index_bits = 8;
    int tag_bits = 33;

    unsigned long long int tag1 = (mem_addr&(((1<<33)-1)<<(2+5+8)))>>(2+5+8);
    unsigned long long int tag2 = (mem_addr&(((1<<tag_bits)-1)<<(byte_offset_bits + block_offset_bits + index_bits)))>>(byte_offset_bits + block_offset_bits + index_bits);

    printf("%s %llx\n", "Tag 1:", tag1);
    printf("%s %llx\n", "Tag 2:", tag2);

}

输出是:

Tag 1: fffeb509
Tag 2: 1

我也收到了正确计算 tag1 的行的警告,这对我来说没有意义,因为 tag1 是 64 位 unsigned long long int,而我只移动了 48 位:

 warning: left shift count >= width of type [enabled by default]

提前感谢您的帮助。

【问题讨论】:

  • (1&lt;&lt;33) 是使用 int 类型计算的,在您的系统上可能只有 32 位。

标签: c bit-shift


【解决方案1】:

所有整数文字值都是int 类型,除非您指定前缀,例如 e.g. 1ULL.

这意味着1&lt;&lt;33 将 32 位有符号值移动了 33 步。你需要做1ULL &lt;&lt; 33

【讨论】:

    【解决方案2】:

    我认为问题在于:常量 1 正在转换为整数类型(4 字节 32 位)。但是,您确实左移了 33 位(超过整数类型),在这种情况下,我们应该在左移之前将 1 转换为 unsigned long long int(8 字节 = 64 位):

    #include <stdio.h>
    
    void main(){
    
        unsigned long long int mem_addr = 0x7fff5a8487c0;
    
        int byte_offset_bits = 2;
        int block_offset_bits = 5;
        int index_bits = 8;
        int tag_bits = 33;
        unsigned long long int one = 1;
        unsigned long long int tag1 = (mem_addr&(((one<<33)-one)<<(2+5+8)))>>(2+5+8);
        unsigned long long int tag2 = (mem_addr&(((one<<tag_bits)-one)<<(byte_offset_bits + block_offset_bits + index_bits)))>>(byte_offset_bits + block_offset_bits + index_bits);
    
        printf("%s %llx\n", "Tag 1:", tag1);
        printf("%s %llx\n", "Tag 2:", tag2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多