我正在使用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位?)
答案 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,也可以提交错误报告。