我阅读了 Endianness 并理解了 squat...
所以我写了这个
main()
{
int k = 0xA5B9BF9F;
BYTE *b = (BYTE*)&k; //value at *b is 9f
b++; //value at *b is BF
b++; //value at *b is B9
b++; //value at *b is A5
}
k
等于 A5 B9 BF 9F
和(字节)指针“walk”o/p 是 9F BF b9 A5
所以我知道字节是反向存储的...好的。
~
所以现在我想它是如何存储在 BIT 级别的...
我的意思是“9f”(1001 1111) 存储为“f9”(1111 1001)?
所以我写了这个
int _tmain(int argc, _TCHAR* argv[])
{
int k = 0xA5B9BF9F;
void *ptr = &k;
bool temp= TRUE;
cout<<"ready or not here I come \n"<<endl;
for(int i=0;i<32;i++)
{
temp = *( (bool*)ptr + i );
if( temp )
cout<<"1 ";
if( !temp)
cout<<"0 ";
if(i==7||i==15||i==23)
cout<<" - ";
}
}
我得到一些随机输出
即使是 nos。像“32”,我没有得到任何明智的东西。
为什么?
最佳答案
为了完整起见,机器是根据字节顺序和位顺序来描述的。
intel x86 被称为 Consistent Little Endian,因为随着内存地址的增加,它以 LSB 到 MSB 的顺序存储多字节值。它的位编号约定是 b0 = 2^0 和 b31 = 2^31。
摩托罗拉 68000 被称为不一致大端,因为随着内存地址的增加,它以 MSB 到 LSB 的顺序存储多字节值。它的位编号约定是 b0 = 2^0 和 b31 = 2^31(与 intel 相同,这就是它被称为“不一致的”Big Endian 的原因)。
32 位 IBM/Motorola PowerPC 称为 Consistent Big Endian,因为随着内存地址的增加,它以 MSB 到 LSB 的顺序存储多字节值。它的位编号约定是 b0 = 2^31 和 b31 = 2^0。
在正常的高级语言下,位顺序通常对开发人员是透明的。当用汇编语言编写或使用硬件时,位编号确实发挥了作用。
关于c - 如何根据 "Endianness"以位级别存储数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932355/