2015-10-25 70 views

回答

3

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 

但是,這是在我看來的可讀性。

+0

謝謝,但在這種情況下,假設我確實希望將這些類型作爲代碼中的字符。我想要設置所有位的char變量,並且只設置最高位。 –

+0

@NeilKirk我編輯了我的答案。請檢查。 –

2

在VS20125中,char默認爲signed,所以它的範圍是-128到+127。爲了抑制警告,聲明abunsigned char,具有範圍從0到255

+0

謝謝,但在這種情況下,假設我想在代碼中將這些類型作爲'char'。我想要設置所有位的char變量,並且只設置最高位。 –

相關問題