gpt4 book ai didi

c++ - Bitshift - 需要解释才能理解代码

转载 作者:太空狗 更新时间:2023-10-29 19:40:27 27 4
gpt4 key购买 nike

我想知道这个函数实际上执行了什么。据我了解,它应该返回 pSrc[1]。

那么为什么它要将 pSrc[0] 左移 8 位,这会将这 8 位清零。当这些零与 pSrc[1] 进行“或”运算时,pSrc[1] 不受影响,因此您无论如何都会得到 pSrc[1],就好像按位或从未发生过一样。

/*
* Get 2 big-endian bytes.
*/
INLINE u2 get2BE(unsigned char const* pSrc)
{
return (pSrc[0] << 8) | pSrc[1];
}

该函数来自dalvik虚拟机源码。 https://android.googlesource.com/platform/dalvik/+/android-4.4.4_r1/vm/Bits.h

更新:

好的,现在我明白了,多亏了这里的所有答案。

(1) pSrc[0]原本是一个unsigned char(1 byte)。

(2)当它被左移(pSrc[0] << 8)与int类型的文字8时,pSrc[0]因此被int提升为signed int(4字节)。

(3) pSrc[0] << 8 的结果是 pSrc[0] 中感兴趣的 8 位被移到 signed int 的 4 个字节的第二个字节,从而在其他字节中留下零(第 1、3 和 4 个字节)。

(4) 当它进行 ORed(步骤 (3) 的中间结果 | pSrc[1])时,pSrc[1] 然后被 int 提升为带符号的 int(4 字节)。

(5) ( intermediate result from step (3) | pSrc[1]) 的结果按照我们想要的方式保留前两个最低有效字节,在两个最高有效字节中全部为零。

(6) 通过将结果作为 u2 类型返回,仅返回前两个最低有效字节以获得 2 个大端字节。

最佳答案

对于这样的算术运算,unsigned char 通过称为积分提升 的过程进行转换。

C++11 - N3485 §5.8 [expr.shift]/1:

The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand.

和 §13.6 [over.built]/17:

For every pair of promoted integral types L and R, there exist candidate operator functions of the form

LR operator%(L , R );
LR operator&(L , R );
LR operator^(L , R );
LR operator|(L , R );
L operator<<(L , R );
L operator>>(L , R );

where LR is the result of the usual arithmetic conversions between types L and R.

完成积分促销后(§4.5 [conv.prom]/1):

A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int.

通过整数提升,unsigned char 将提升为int。另一个操作数已经是 int,所以它的类型没有改变。然后返回类型也变为 int

因此,您拥有的是第一个 unsigned char 的位向左移动,但仍在现在更大的 int 中,然后是第二个 unsigned char 末尾的位。

您会注意到 operator| 的返回类型是两个操作数之间通常算术转换的结果。此时,它们是来自 shift 的 int 和第二个 unsigned char

此转换定义如下 (§5 [expr]/10):

Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:

Otherwise, the integral promotions (4.5) shall be performed on both operands. Then the following rules shall be applied to the promoted operands:

If both operands have the same type, no further conversion is needed.

因为 LR,在这之前被提升,已经是 int,提升使它们保持不变,整体返回类型为因此表达式是 int,然后将其转换为 u2,无论它是什么。

关于c++ - Bitshift - 需要解释才能理解代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24489929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com