为什么可能丢失数据的赋值不会产生编译器警告

时间:2017-12-23 15:37:45

标签: c++ casting warnings stdint

我正在使用MS Visual Studio 2017和(正如预期的那样)我收到编译器警告:

Warning C4244   '=': conversion from 'unsigned long' to 'unsigned short', possible loss of data

关于这个C ++代码:

unsigned long test32{70000};
unsigned short test16;
test16 = test32;

但是,当我使用cstdint typedef:

uint32_t test32{70000};
uint16_t test16;
test16 = test32;

...我根本没有得到任何编译器警告。为什么呢?

此外,作为一种严格类型的语言,不应该给C ++编译器提供错误而不是警告这些方法中的任何一种(并迫使我明确地转换32位值)在第三行中分配之前的16位?)

1 个答案:

答案 0 :(得分:0)

没有。该标准没有规定编译器如何发出诊断。见[defns.diagnostic]:

  

属于实现定义的实现输出消息子集的消息

是警告还是错误取决于编译器。要回答你的第二个问题,这似乎是一个QoI问题。例如,GCC会发出诊断信息:

g++ -std=c++11 -Wconversion test.cpp
test.cpp: In function ‘int main()’:
test.cpp:6:10: warning: conversion to ‘uint16_t {aka short unsigned int}’ from ‘uint32_t {aka unsigned int}’ may alter its value [-Wconversion]
 test16 = test32;

您可以使用Visual Studio中的警告设置尝试messing around,也可以提交错误报告。