警告C4309 - 这是什么意思,在这种情况下是否可以忽略?

Nei*_*irk 8 c++ visual-studio

使用VS2015

char a = 0xFF;
char b = 0x80;
Run Code Online (Sandbox Code Playgroud)

两条线都给出了 warning C4309: 'initializing': truncation of constant value

但是当我在调试器中查看它时,变量确实包含正确的值.

在这种情况下警告意味着什么?我可以忽略它还是我的代码不好?

Ale*_*op. 8

来自https://msdn.microsoft.com/en-us/library/sz5z1byt.aspx

'转换':截断常数值

类型转换导致常量超过为其分配的空间.您可能需要为常量使用更大的类型.

以下示例生成C4309:

// C4309.cpp //编译:/ W2

int main()
{
   char c = 128;   // C4309
}
Run Code Online (Sandbox Code Playgroud)

编译器假设您希望0xFF和0x80为正数.与示例中一样,它写为128而不是带-符号的负数.

因此,编译器会让您知道char是一个8位的有符号类型,这意味着您的值设置了"符号位",尽管它没有标记为负数.

如果变量的符号对您不重要,请unsigned char改用.这也将删除此警告.

编辑

如果您知道自己在做什么并且故意设置MSB位,则可以使用强制转换来抑制警告:

char a = static_cast<char>(0xFF);
char b = static_cast<char>(0x80);
Run Code Online (Sandbox Code Playgroud)

或者使用#pragma为这些行禁用此特定警告:

#pragma warning( disable : 4309 )
char a = 0xFF;
char b = 0x80;
#pragma warning( default : 4309 )
Run Code Online (Sandbox Code Playgroud)

我个人喜欢第一个选项,因为它适用于每个编译器,而#pragma选项特定于MVSC.

EDIT2

当然你总能写

char a = -1; //0xFF
char b = -128; // 0x80
Run Code Online (Sandbox Code Playgroud)

但在我看来这不太可读.