c - 按整数值进行位移位

标签 c bit-shift

此代码用于缓存模拟器项目 - 我正在尝试从内存地址中提取某些位。当我尝试使用 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 位无符号 long long int,而我只移动了 48 位:

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

预先感谢您的帮助。

最佳答案

所有整数文字值均为 int类型,除非您指定前缀,例如1ULL .

这意味着1<<33将 32 位有符号值移位 33 步。你需要做1ULL << 33 .

关于c - 按整数值进行位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803345/

相关文章:

c - recvfrom() 中的 addrlen 字段是做什么用的?

c - 使用 `madvise` 将大内存映射归零

c - 计算三个嵌套 for 循环的总体进度 (%)

actionscript - 对 RGB 值使用逻辑位移

javascript - 添加两个带移位的十六进制数字javascript

c# - 在字节数组中设置特定位

java - 声明与其定义类型相同的结构变量

c - 将汇编语言翻译成 C [使用 PIC18 写入内存]

c++ - 如何在 C++ 中右移位?

c - 在 C 中声明 64 位变量