按位运算的结果是否依赖于Java中的字节序?在C或C ++中呢?

时间:2014-08-27 14:50:22

标签: java c++ c bitwise-operators endianness

请考虑以下代码:

long store;
int firstValue = 0x1234;
int secondValue = 0x5678;
store = (((long) firstValue) << 32) | secondValue;

store保证值0x12345678,无论机器的字节顺序如何......

  • 在Java?
  • 在C或C ++中?

3 个答案:

答案 0 :(得分:8)

所有这些语言中的bitshift操作都在数字上运行。字节序不是数字的属性。

在Java中,store保证具有值0x123400005678L,因为0x1234L << 320x123400000000L

在C和C ++中store不保证具有任何特定值:结果取决于所涉及类型的大小,并且由于溢出而具有潜在的未定义行为(long被允许小到32位,实际上在一些主流实现中是如此)。如果没有发生溢出,则结果与Java相同。

答案 1 :(得分:2)

我认为你的意思是移位16位而不是32位来获得0x12345678。移位32将在Java和大多数C / C ++实现中溢出。

这是有保证的,并且与字节顺序无关。字节顺序确定多字节值如何存储在内存中,而不是哪些位逻辑上位于值中的哪个位置。左移N位总是相当于乘以2 N

答案 2 :(得分:1)

尽管机器使用的是补码还是两个补码,但是字节顺序并不重要。

  • 在C中,<<不受影响,因为它是根据算术运算(乘法和取幂)定义的。
  • 在Java中,<<不受影响,因为它是根据算术运算(乘法,取幂,加法,算术否定和减法)定义的。
  • 在C中,|是根据基础位定义的。字节顺序没有任何效果,但它可以在一个字符串上表现不同。补充机器而不是双补机。
  • 在Java中,|不受影响,因为Java整数总是两个补码。

我认为C ++与C相同。