lin*_*lof 9 c gcc type-conversion compiler-warnings
GCC警告我,以下代码包含可能更改值的隐式转换:
#include <stdlib.h>
float square = rand();
Run Code Online (Sandbox Code Playgroud)
但是,以下内容不会产生任何警告:
float square = 100;
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会发出的警告如下:
tests/ChemTests.cpp:17:23: error: conversion to ‘float’ from ‘int’ may alter its value
Run Code Online (Sandbox Code Playgroud)
我不明白为什么前者会发出警告,因为rand()
正确声明并返回一个int
,就像100
整数文字一样.
为什么第一行给出编译器警告而不是第二行,即使两者都有隐式转换int
为float
?
Mys*_*ial 14
当演员阵容导致精度损失时,GCC会发出此警告.(换句话说,价值可能会被"改变")
在第一种情况下,rand()
返回一个int
.由于并非所有可以存储在a int
中的值都可以表示为a float
,因此它会发出此警告.
在第二种情况下,100可以安全地铸造成float
没有任何精度损失.
要添加的东西是什么Mysticial写的(这是正确的):你的C的实现使用float
是32位IEEE 754单精度二进制浮点和int
是32位.在"你的"中int
你可以有31位的数字和1位的符号.在"你的"浮点数mantissa
是24位,有1位符号.显然int
,需要超过24位加号的代表不能完全转换为"你的" float
.(我使用"你的"代表你的编译器,你正在使用的编译器.C标准没有说明float
or 的确切长度int
.
现在,rand()
可以生成任何int
数字,因此编译器必须向您发出警告.这100
是一个在编译时已知的数字文字,因此编译器可以静态检查该数字是否可转换.
(即使没有详细解释浮点如何工作,你的int
是32位并且"仅支持"整数.你float
是32位并且"支持"浮点数.显然浮点数更难以表示(你必须保存在哪里小数点),所以必须有一个"价格"一分钱一分货,如果双方int
并float
具有相同的长度,价格是精度).
要回复您所做的评论,您可以准确表示的最大数字float
是"连续"为0(因此0 ...数字都可以完全表示)是16777215(尾数= 16777215,指数= 0)和16777216(尾数= 1,指数= 24,因为它是1*2 ^ 24).16777217无法准确描述.16777218是.
归档时间: |
|
查看次数: |
3201 次 |
最近记录: |