内存中的位镜像

Bits mirroring in memory

当我尝试打印存储在 uint64_t 中的数字中的每一位时,位号 32 之后的位是相同的。

例如,如果我读到 3 是 011,当我打印它时它是 1100000...11000000。 该数字似乎在第 32 位之后“镜像”。 当我用 printf 打印数字时,它是 3 为什么会这样?

long long int memory;
scanf("%lld",&memory);
for(int i = 63;i>=0;i--){
       long long int nr = (1<<i);
       if((memory & nr)==0)
          printf("%d",0);
        else
          printf("%d",1);
   }

1<<i中,1是一个int,当i的值为in的位数时,C标准没有定义表达式int 或更大。

将其更改为 (unsigned long long int) 1 << i1ull << i。 (这假定您的 C 实现使用二进制补码,基本上所有现代实现都这样做。否则,检查有符号整数的位有点棘手。)

正如其他用户提到的那样,问题出在班次上。

但我会用另一种方式实现它:

#define  SetMSBit(type) (((~(type)0) >> 1) ^ (~(type)0))

void printBits64(const uint64_t val)
{
    char ch;
    for(uint64_t mask = SetMSBit(uint64_t); mask; mask >>= 1)
    {
        printf("%c", (val & mask) ? '1' : '0');
    }
}