【问题标题】:Bitwise operators and "endianness"位运算符和“字节序”
【发布时间】:2010-11-05 16:58:53
【问题描述】:

endianness 与按位运算有关系吗? logical 或转移?

我正在做有关按位运算符的作业,但我无法对其进行正面或反面,而且我认为我对字节序非常感兴趣。也就是说,我正在使用一个小端机器(就像大多数机器一样),但这是否需要考虑或者这是一个浪费的事实?

如果重要的话,我使用的是 C。

【问题讨论】:

  • 恕我直言,这些问题略有不同。这个问题就像“128 << 2 == 512 在任何 CPU 上吗?”,这个问题就像“128 << 2 在任何 CPU 上都布置成0x02 0x00?”。

标签: c bit-manipulation endianness bit-shift


【解决方案1】:

您没有指定一种语言,但通常情况下,诸如 C 之类的编程语言在位运算中抽象了字节顺序。所以不,在按位运算中并不重要。

【讨论】:

  • 鉴于该问题没有修订,我很惊讶你说他没有提到语言,当他提到时,它也被标记为 C。
  • @Simeon:在我写这个答案的时候还没有。单个作者在短时间内的编辑将合并为一个。这就是为什么您将其视为单个修订版。
【解决方案2】:

字节序仅对内存中数据的布局很重要。一旦要操作的处理器加载数据,字节顺序就完全无关紧要了。无论字节顺序如何,移位、按位运算等都按您预期的方式执行(数据按逻辑从低位到高位排列)。

【讨论】:

  • 逻辑上不应该是“高位到低位”吗?
  • @legends2k: 有同样的想法
  • @legends2k:是的。左移 = 乘以 2 的幂。右移 = 除以 2 的幂(舍入不同于负值的整数除法)。
  • @JoshC:不,PDP-10 只会按照在数据上逻辑定义的方式执行操作,而不管其内存/寄存器中的确切位置。考虑一下:当您添加两个 32 位整数时,您不必担心处理器必须转换数据才能使加法工作(也不必担心硬件中字节中的位顺序)- ALU 只是做“正确的事情”,因为它的连接方式与其硬件兼容。移位是相同的方式——它们以抽象出硬件的字节/位顺序细节的方式对数据进行操作。
  • @JoshC: (cont.) 而在 C 中,移位运算符的定义方式更加抽象:它们是根据它们产生的值来定义的,而不是根据它们移动底层位的方式(因此,如果您在某个晦涩的平台上,其中硬件位移指令会产生无效的位布局,例如您已将值位转换为填充位,则需要符合要求的编译器据我了解,生成解决该问题的说明)。
【解决方案3】:

位运算符抽象出字节序。例如,>> 运算符总是将位移向最低有效位。但是,这并不意味着在使用它们时完全忽略字节序是安全的,例如,在处理较大结构中的单个字节时,您不能总是假设它们会落在同一个位置。

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

为了澄清,我对这里的其他答案没有基本的分歧。我要强调的一点是,尽管位运算符本质上是字节序中性的,但您不能忽略代码中字节序的影响,尤其是与其他运算符结合使用时。

【讨论】:

  • 您基本上不同意所有人的观点,但您的答案被评为最佳。如何识别行为?
  • 我已经添加了一些进一步的说明
  • 所以进一步澄清你的意思是,除非我实际上以字节为单位检索值,否则一切正常?
  • O.o so >> 和
【解决方案4】:

正如其他人所提到的,移位由 C 语言规范定义并且与字节顺序无关,但右移位的实现可能会有所不同,具体取决于架构使用的是补码还是补码算法。

【讨论】:

    【解决方案5】:

    这取决于。无需将数字转换为新类型,您可以透明地处理字节顺序。

    但是,如果您的操作涉及一些新的类型转换,请谨慎行事。

    例如,如果您想右移一些位并(显式或不显式地)转换为新类型,字节序很重要!

    要测试您的字节顺序,您可以简单地将 int 转换为 char

    int i = 1;
    
    char *ptr;
    
    ...
    
    ptr = (char *) &i;  //Cast it here
    
    return  (*ptr);
    

    【讨论】:

    • ...或者创建一个联合...{union { int i = 1; char a[4];} b;return b.a[3] == 1;} //big endian
    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多