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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么分配可能会丢失数据而不会产生编译器警告相关的知识,希望对你有一定的参考价值。

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

答案

不是。该标准没有规定编译器如何发出诊断。见[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,也可以提交错误报告。

以上是关于为什么分配可能会丢失数据而不会产生编译器警告的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 不会因丢失数据而发出警告或失败

为啥我会从“double”转换为“float”,可能会丢失数据警告?(c)

求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?

09-01 关于;;和“参数”: 从“time_t”转换到“unsigned int”,可能丢失数据和C 语言代码出错为什么显示「烫烫烫」

为啥这段代码会给出“可能的空引用返回”编译器警告?

CUDA 多编译器警告