请考虑以下代码:
long store;
int firstValue = 0x1234;
int secondValue = 0x5678;
store = (((long) firstValue) << 32) | secondValue;
store
保证值0x12345678
,无论机器的字节顺序如何......
答案 0 :(得分:8)
所有这些语言中的bitshift操作都在数字上运行。字节序不是数字的属性。
在Java中,store
保证具有值0x123400005678L
,因为0x1234L << 32
是0x123400000000L
。
在C和C ++中store
不保证具有任何特定值:结果取决于所涉及类型的大小,并且由于溢出而具有潜在的未定义行为(long
被允许小到32位,实际上在一些主流实现中是如此)。如果没有发生溢出,则结果与Java相同。
答案 1 :(得分:2)
我认为你的意思是移位16位而不是32位来获得0x12345678
。移位32将在Java和大多数C / C ++实现中溢出。
这是有保证的,并且与字节顺序无关。字节顺序确定多字节值如何存储在内存中,而不是哪些位逻辑上位于值中的哪个位置。左移N位总是相当于乘以2 N 。
答案 2 :(得分:1)
<<
不受影响,因为它是根据算术运算(乘法和取幂)定义的。<<
不受影响,因为它是根据算术运算(乘法,取幂,加法,算术否定和减法)定义的。|
是根据基础位定义的。字节顺序没有任何效果,但它可以在一个字符串上表现不同。补充机器而不是双补机。|
不受影响,因为Java整数总是两个补码。我认为C ++与C相同。