c - 如何根据 "Endianness"以位级别存储数据?

标签 c pointers endianness bit

我阅读了 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/

相关文章:

c - 反汇编程序未出现 Visual Studio

C - 指向随机值的指针

简单操作后 C++ 堆损坏

c - 指向 char 到 char 数组的指针

c - getc(stdin) 在一种变体中不记录 '+' 和 '-',但是它接受 '*' 和 '/'

c - Mac OS X 上由 pclose() 引起的 Valgrind 错误

C 头文件错误 : expected identifier or ‘(’ before ‘[’ token

c++ - 访问 float 的 4 个字节是否会破坏 C++ 别名规则

format - 为什么字节顺序存在?

java - 用于 C++ 程序的 ByteSwapping Java float