3

我正在使用 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 typedefs 时:

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

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

此外,作为一种严格类型的语言,C++ 编译器不应该给我错误而不是警告这些方法中的任何一种(并强制我在第三行赋值之前将 32 位值显式转换为 16 位)?

4

1 回答 1

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中的警告设置或提交错误报告。

于 2017-12-23T16:40:00.723 回答