首页 > 解决方案 > linux 64位操作系统上的位移

问题描述

这是我的代码:

union myStruct
{
    struct
    {
        uint32_t
            A       : 1,  // 00
            B       : 4,  // 04:01
            C       : 25, // 29:05
            D       : 2;  // 31:30
    } sData;
    uint32_t        ulData;
};
myStruct p;
p.ulData = 0;

p.sData.C = 0x524;

printf("p.ulData = %x\n", p.ulData);
printf("p.sData.C = %x\n", p.sData.C);
printf("p.sData.D = %x\n", p.sData.D);

uint32_t data32 = p.sData.C << 0x15;
printf("data32 = %x \n", data32);

uint64_t data64const32 = static_cast<uint32_t>(p.sData.C) << 0x15;
printf("data64const32 = %lx \n", data64const32);

uint64_t data64const64 = static_cast<uint64_t>(p.sData.C) << 0x15;
printf("data64const64 = %lx \n", data64const64);

uint64_t data64 = p.sData.C << 0x15;
printf("data64 = %lx \n", data64);

输出是:

#p.ulData = a480    
#p.sData.C = 524
#p.sData.D = 0
#data32 = a4800000
#data64const32 = a4800000
#data64const64 = a4800000
#data64 = ffffffffa4800000

显然最后的输出是错误的。

更有趣的是,仅在 linux 上输出错误

Distributor ID: SUSE LINUX
Description:    SUSE Linux Enterprise Server 11 (x86_64)
Release:        11
g++ (GCC) 6.3.0

它在 Windows 上正确输出。(win10/VS2017)

我有点理解这个问题与 64 位操作系统上的位移有关。而且我知道如何解决它。

我担心的是我的项目中可能会有更多这样的代码。很难找到它们。

有没有办法使用任何 g++ 编译选项来捕获此类代码?

标签: c++linux64-bitbitshift

解决方案


推荐阅读