为什么分配可能会丢失数据,而不是产生编译器警告

Why is assignment with possible loss of data NOT producing compiler warning

本文关键字:警告 编译器 数据 分配 为什么      更新时间:2023-10-16

我正在使用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位)?

no。该标准不要求编译器如何发出诊断。请参阅[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中的警告设置弄乱或提交错误报告。