考虑下面的代码。如何安全地将更宽的整数类型转换为位域?
#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))
您唯一的选择可能是关闭该特定警告。如果你想知道你需要如何指定你的编译器。 –
@MarkRansom,不幸的是,这个语句出现在头文件的模板化函数中,而且我正在编写一个库,所以我必须要求我的库的每个用户也关闭警告,这似乎可能会减少一套愿意尝试我的图书馆的应用程序。 – merlin2011