使用VS2015
char a = 0xFF;
char b = 0x80;
Run Code Online (Sandbox Code Playgroud)
两条线都给出了 warning C4309: 'initializing': truncation of constant value
但是当我在调试器中查看它时,变量确实包含正确的值.
在这种情况下警告意味着什么?我可以忽略它还是我的代码不好?
来自https://msdn.microsoft.com/en-us/library/sz5z1byt.aspx
'转换':截断常数值
类型转换导致常量超过为其分配的空间.您可能需要为常量使用更大的类型.
以下示例生成C4309:
// C4309.cpp //编译:/ W2
Run Code Online (Sandbox Code Playgroud)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);
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)
但在我看来这不太可读.
| 归档时间: |
|
| 查看次数: |
3435 次 |
| 最近记录: |