最近在敲代码时,突然好奇vs错误列表中对于初始化出现的警告问题,想着把它弄懂一些,以下是个人的总结(如有错误恳请指正)。
一、问题描述
在初始化变量时,时常出现如下的警告:
虽然不影响我们程序的正常编译,但是多少会让感觉不舒服。
二、解决方法:
1、在初始化时,如果遇到“截断”的警告:
“警告 C4244 “初始化”: 从“double”转换到“float”截断”
处理前:
float a = 8.1;
处理后:
float a = 8.1f;
2、在初始化时,如果遇到“可能丢失数据”的警告:
“警告 C4244 “初始化”: 从“double”转换到“float”,可能丢失数据”
处理前:
double x = 8.1;
float y = x;
处理后:
double x = 8.1;
float y = (float) x;
三、区别解释
1、如上述的例子1,变量a在初始化时直接用小数8.1进行赋值,但在 C 语言中,如果不指定数据类型,那么小数常量会被认为是 double 类型。double型转float型需要进行数据截断。但对于用户而言,这只是一个小数(当没有输入精度要求时),故编译器只是告诉你这个地方计算机截断过了一次而已。
2、在例子2中,8.1是double型,赋值给同为double型的x,故第一句不会发出警告。
但是在第二句中,把double型的x赋给float型的y时,调试器会认为你忘记了x是一个double型(如果记得的话,你就会先把x强制转换成float型再进行赋值的,如处理后的那样)。故编译器会说你是不是没注意到呀,这里可能会丢数据哦(当有效位数多时可能真就会丢数据)。
总之,在用具体的小数给float初始化时,会显示截断;变量之间赋值时,显示的是可能丢失数据。