内存中的位镜像
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 << i
或 1ull << 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');
}
}
当我尝试打印存储在 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 << i
或 1ull << 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');
}
}