Вот мой код:
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 ++?