【问题标题】:Implicit conversion of float to int and possibility of loss of valuefloat 到 int 的隐式转换和价值损失的可能性
【发布时间】:2021-04-26 15:31:55
【问题描述】:

我正在学习 C 中的数据类型。

我们的课程资料详情如下

当我们分配不同数据类型的不同变量时,有一个 价值损失的可能性。

float f = 100.6537;
int i = f;

执行上述代码后,i = 100。如果我错了,请纠正我,将浮点数分配给 int 只是小数部分,而仅将整数值分配给小数点左侧?这里的价值损失是删除小数点后的数字?

但当我这样做时,

int i = 100;
float f = i;

我认为这里没有价值损失?

【问题讨论】:

  • 是的,在这种特殊情况下。
  • 是的,你的想法在这两种情况下都是正确的。请注意,如果浮点类型无法处理整数类型的精度,那么从整数转换为浮点数也会有损失。例如,32but 浮点数通常具有大约 7 位精度,因此将 123456789 写入 1 会失去精度。

标签: c


【解决方案1】:

并非每个int 都可以表示为floatfloat 缺少足够的“位置”来表示所有可能的值。请记住,sizeof(int)==sizeof(float) 在许多机器上。在IEEE-754 格式中,您只能在float 中获得24 位“值”。

换句话说:

int   = snnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
float = seeeeeeeennnnnnnnnnnnnnnnnnnnnnn

e 部分是指数。注意int 有更多的位来表示数值。

对于任何完全适合 24 位数字的东西,你应该没问题,但值得在你的硬件上进行测试以确保。

【讨论】:

  • 所以在 int 的情况下,我有 32 位来表示一个数字,而在浮点的情况下只有 24 位来表示尾数?这意味着最大值 = (2^24 - 1) 可以用浮点数表示而不会丢失值,对吧?
  • 粗略地说,是的。从技术上讲,您可以发出更多偶数幂的值,但这有点尴尬,因为幂以基数 2 表示。您可以使用可以处理整个范围的double,它有 53 位“有效数字”。
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2022-09-20
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2015-02-28
相关资源
最近更新 更多