使用VS2015警告C4309 - 這是什麼意思,在這種情況下可以忽略?
char a = 0xFF;
char b = 0x80;
兩條線給warning C4309: 'initializing': truncation of constant value
但是,當我看着它在調試器,變量確實包含正確的價值觀。
這種情況下警告的含義是什麼?我可以忽略它還是我的代碼不好?
使用VS2015警告C4309 - 這是什麼意思,在這種情況下可以忽略?
char a = 0xFF;
char b = 0x80;
兩條線給warning C4309: 'initializing': truncation of constant value
但是,當我看着它在調試器,變量確實包含正確的價值觀。
這種情況下警告的含義是什麼?我可以忽略它還是我的代碼不好?
從https://msdn.microsoft.com/en-us/library/sz5z1byt.aspx
「轉化」:恆定值的截斷
的類型轉換造成的恆定超過分配給 的空間。您可能需要爲常量使用較大的類型。
下面的示例生成C4309:
// // C4309.cpp與編譯:/ W2
int main() { char c = 128; // C4309 }
編譯器假設你希望0xFF和0x80到正數。像在這個例子中一樣,它被寫入128而不是負號-
符號。
所以編譯器讓你知道char是一個8位的帶符號類型,這意味着你的值設置了「符號位」,儘管它沒有被標記爲負數。
如果變量的符號對您不重要,請改爲使用unsigned char
。這也會消除這個警告。
編輯
如果你知道你在做什麼你設置目的的MSB位,您可以使用鑄造抑制警告:
char a = static_cast<char>(0xFF);
char b = static_cast<char>(0x80);
或者使用#pragma
對這些行禁用此特定警告:
#pragma warning(disable : 4309)
char a = 0xFF;
char b = 0x80;
#pragma warning(default : 4309)
我個人認爲是第一個選項,因爲它將適用於每個編譯器,而#pragma選項特定於MVSC。
EDIT2
當然,你可以寫
char a = -1; //0xFF
char b = -128; // 0x80
但是,這是在我看來的可讀性。
在VS20125中,char
默認爲signed
,所以它的範圍是-128到+127。爲了抑制警告,聲明a
和b
如unsigned char
,具有範圍從0到255
謝謝,但在這種情況下,假設我想在代碼中將這些類型作爲'char'。我想要設置所有位的char變量,並且只設置最高位。 –
謝謝,但在這種情況下,假設我確實希望將這些類型作爲代碼中的字符。我想要設置所有位的char變量,並且只設置最高位。 –
@NeilKirk我編輯了我的答案。請檢查。 –