考虑以下代码。
#include <stdint.h>
struct MaskAndCount{
uint64_t occupied : 56;
uint8_t numOccupied : 8;
};
int main(){
int count = 7;
MaskAndCount foo;
foo.occupied &= ~(1L << count);
}
如果我用以下代码编译这段代码-Wconversion
,然后我会收到以下错误。
g++ -Wconversion Main.cc
Main.cc: In function ‘int main()’:
Main.cc:11:18: warning: conversion to ‘long unsigned int:56’ from ‘long unsigned int’ may alter its value [-Wconversion]
foo.occupied &= ~(1L << count);
这似乎是一个合理的担忧,但我想要的行为恰恰是截断右侧值的所有高位。
我的问题是双重的。
- 所写的转换是否会达到截断右侧值的高位的预期效果?
- 有没有办法在本地消除警告或使用不触发警告的不同语法表达相同的行为?
请注意,我尝试了以下静态转换,它根本无法编译。
static_cast<uint64_t:56>(~(1L << count))
最高位(如果设置)将被忽略。
您可以通过在赋值之前自行删除顶部位来避免警告:
int count = 7;
MaskAndCount foo = {};
// chop off the top 8 bits
foo.occupied &= ~(1 << count) & 0x00FFFFFFFFFFFFFFUL;
EDIT:事实证明这不起作用|=
(不知道为什么)。但这可以通过避免来解决|=
并使用正常分配:
foo.occupied = (foo.occupied & ~(1UL << count)) & 0x00FFFFFFFFFFFFFFUL;
foo.occupied = (foo.occupied | ~(1UL << count)) & 0x00FFFFFFFFFFFFFFUL;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)