gpt4 book ai didi

c++ - 为什么移动一个值比它的大小更远不会导致 0?

转载 作者:行者123 更新时间:2023-11-28 05:20:43 25 4
gpt4 key购买 nike

实际细化问题:

为什么不打印0?

#include "stdafx.h"
#include <iostream>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char barray[] = {1,2,3,4,5,6,7,8,9};
unsigned long weirdValue = barray[3] << 32;

std::cout << weirdValue; // prints 4
std::string bla;
std::getline(std::cin, bla);
return 0;
}

移位操作的反汇编:

   10:  unsigned long weirdValue = barray[3] << 32;
00411424 movzx eax,byte ptr [ebp-1Dh]
00411428 shl eax,20h
0041142B mov dword ptr [ebp-2Ch],eax

原始问题:

我在我们维护的一些旧代码中发现了以下片段。它将字节数组转换为多个浮点值并将 float 添加到列表中。为什么它适用于大于 4 的字节数组?

unsigned long ulValue = 0;
for (USHORT usIndex = 0; usIndex < m_oData.usNumberOfBytes; usIndex++)
{
if (usIndex > 0 && (usIndex % 4) == 0)
{
float* pfValue = (float*)&ulValue;
oValues.push_back(*pfValue);
ulValue = 0;
}

ulValue += (m_oData.pabyDataBytes[usIndex] << (8*usIndex)); // Why does this work for usIndex > 3??
}

如果 << 是旋转运算符,而不是移位运算符,我会理解这是可行的。或者如果是

ulValue += (m_oData.pabyDataBytes[usIndex] << (8*(usIndex%4)))

但是我发现的代码让我很困惑。

代码是使用 VS 2005 编译的。如果我在即时窗口中尝试原始代码段,但它不起作用。

我知道如何正确地做到这一点,我只是想知道为什么代码,尤其是移位操作按原样工作。

编辑:移位操作的反汇编是:

13D61D0A  shl         ecx,3   // multiply uIndex by 8
13D61D0D shl eax,cl // shift to left, does nothing for multiples of 32
13D61D0F add eax,dword ptr [ulValue]
13D61D15 mov dword ptr [ulValue],eax

所以反汇编没问题。

最佳答案

移位计数被屏蔽为 5 位,这将范围限制为 0-31。

因此,32 的移位与零的移位相同。

http://x86.renejeschke.de/html/file_module_x86_id_285.html

关于c++ - 为什么移动一个值比它的大小更远不会导致 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41565850/

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