c++ - 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++ 编译选项来捕获此类代码?
解决方案
推荐阅读
- python - 如何在 Python 中实现图像的 4 和 8 连接路径
- r - 按行计算缺失值并添加缺失值的数量
- scala - 如何确保元组是同质的?
- javascript - 单击正确的图像时如何增加计数器
- sql-server - NAS 上的 Docker 容器。需要 SQL 数据库的共享文件夹
- angular - 使用内部订阅将数组映射到另一个数组
- python - 基于overlapp python合并两个元组列表
- typescript - 如何理解 typescript 中类型定义中的 `[0, 1, 2, ...0[]]`?
- java - SLF4J debug(String msg, Throwable t) 惰性求值
- java - 加载已编译的 DLL 时 JVM 退出且没有任何错误消息