考慮下面的代碼。如何安全地將更寬的整數類型轉換爲位域?
#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