gpt4 book ai didi

c++ - 如何安全地将更宽的整数类型转换为位域?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:21 26 4
gpt4 key购买 nike

考虑以下代码。

#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);

这似乎是一个合理的担忧,但我想要的行为恰恰是截断右侧值的所有高位。

我的问题是双重的。

  1. 所写的转换是否会产生截断右侧值的高位的预期效果?
  2. 是否有办法在本地使警告静音或使用不触发警告的不同语法表达相同的行为?

请注意,我已经尝试了以下静态转换,它根本无法编译。

static_cast<uint64_t:56>(~(1L << count))

最佳答案

最高位(如果已设置)将被忽略。

您可以通过在赋值之前自行删除最高位来避免警告:

int count = 7;
MaskAndCount foo = {};
// chop off the top 8 bits
foo.occupied &= ~(1 << count) & 0x00FFFFFFFFFFFFFFUL;

编辑:事实证明这对 |= 不起作用(不知道为什么)。但这可以通过避免 |= 并使用正常赋值来解决:

foo.occupied = (foo.occupied & ~(1UL << count)) & 0x00FFFFFFFFFFFFFFUL;
foo.occupied = (foo.occupied | ~(1UL << count)) & 0x00FFFFFFFFFFFFFFUL;

关于c++ - 如何安全地将更宽的整数类型转换为位域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com