从'size_t'到'const double'的转换,可能会丢失数据

问题描述 投票:0回答:3

给出变量size_t idx,当在64位以下编译时,类似double value = idx;的赋值产生以下警告:

'initializing': conversion from 'size_t' to 'double', possible loss of data

似乎与size_t值在64位以下编译时占用8个字节这一事实有关。但是,分配double value = static_cast<double>(idx)不会产生任何警告。有人可以向我解释为什么前一个作业不起作用而后者却起作用吗?

提前感谢!

c++ static-cast
3个回答
1
投票

static_cast<double>是告诉编译器您有意识地转换为static_cast<double>并了解所有含义的方式。这意味着编译器不应警告您风险,因为您已经明确告知风险,您已经意识到这些风险。

在第一种情况下,如果您不使用double,则转换是合法的,但存在失去精度的风险。由于您可能没有注意到此转换正在进行中,因此有必要警告您。


1
投票

这两个作业都将“起作用”,并且实际上会做完全相同的事情!唯一的不同是,在第二种情况下,static_cast,您的explicit强制类型转换使编译器清楚地知道您“知道自己在做什么”,并且转换中可能会损失很多数字。

在第一种情况下,编译器只是警告您转换可能(无意中)导致数据丢失(在这种情况下为精度)。


1
投票

当你做的时候

double value = static_cast<double>(idx)

编译器看了看然后说:“嘿,double value = idx; 可能不适合idx,让我们告诉程序员万一这是一个错误。”这就是为什么您收到警告。

当你做的时候

value

编译器看了看然后说:“哦,程序员在这里明确地强制转换,这一定是他们想要的。”这意味着它不会发出警告。


0
投票

这是一个警告,因为程序员可能没有意识到他们在分配过程中正在丢失位。

但是如果您在那里有显式转换,则编译器会假定程序员知道他们在做什么,因为该转换就在您的面前,就在您的面前。

© www.soinside.com 2019 - 2024. All rights reserved.