如何安全地将更宽的整数类型转换为位域
How can I safely convert a wider integer type to a bitfield?
考虑以下代码:
#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;
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 有没有办法将字符类型转换为整数?
- 类型转换问题:返回为整数而不是浮点/类型
- 将字符串转换为整数类型T,检查是否存在溢出
- 整数在 C++ 中没有被类型转换为布尔值
- 如何处理警告:从较小的整数类型int转换为int*
- 在编译时将类型转换为整数
- 如何在 python 中将无符号字符类型的整数字符串转换为整数
- 类型转换问题:字符数组的元素转换为整数变量
- 将枚举类型转换为整数,反之亦然
- 将浮点数 32 位变量类型转换为无符号整数 32 位时进行了哪些位级更改
- 如何让 VS2013 停止生成对整数类型之间强制转换的__dtol3、__dtoui3和其他函数的调用
- 如何将字节数组转换为整数类型(整数、长整型、短型等)"安眠安"?
- 为什么将整数文本类型转换为指针值会导致非常量表达式
- 类型转换并将 void 指针变量分配给 VC++ 中的整数变量
- boost序列化错误C4308:负整数常量转换为无符号类型
- 如何安全地将更宽的整数类型转换为位域
- int8_t 和 char:在指针之间转换为具有不同符号的整数类型 - 但它不会
- 如何防止使用多种整数类型的boost::变体类型的隐式转换