![](/img/trans.png)
[英]C4267: 'return' : conversion from 'size_t' to 'const UINT', possible loss of data
[英]conversion from 'size_t' to 'const double', possible loss of data
給定一個變量size_t idx
,一個像double value = idx;
這樣的賦值double value = idx;
在 64 位下編譯時產生以下警告:
'initializing': conversion from 'size_t' to 'double', possible loss of data
這似乎與在 64 位下編譯時size_t
值占用 8 個字節有關。 但是,賦值double value = static_cast<double>(idx)
不會產生任何警告。 有人可以向我解釋為什么前一個任務不起作用而后者起作用嗎?
提前致謝!
當你做
double value = idx;
編譯器查看它並說:“嘿, idx
可能無法放入value
,讓我們告訴程序員,以防它出錯。”。 這就是您收到警告的原因。
當你做
double value = static_cast<double>(idx)
編譯器看着它,然后說:“哦,程序員在這里明確地進行了轉換,這一定是他們想要的。”。 這意味着它不會出現警告。
static_cast<double>
是您告訴編譯器您有意識地轉換為double
並了解所有含義的方式。 這意味着編譯器不應該警告您風險,因為您已經明確告訴它您已經意識到它們。
在第一種情況下,您不使用static_cast
,轉換是合法的,但有失去精度的風險。 由於您可能沒有注意到這種轉換正在發生,因此向您發出警告是有意義的。
這兩項任務都將“有效”,而且實際上,做的事情完全一樣! 唯一的區別是,在第二種情況下, double value = static_cast<double>(idx)
,您的顯式轉換向編譯器表明您“知道自己在做什么”並且您可能會在轉換中丟失有效數字.
在第一種情況下,編譯器只是警告您您的轉換可能(無意中)導致數據丟失(或精度,在這種情況下)。
這是一個警告,因為程序員可能沒有意識到他們在賦值期間丟失了位。
但是如果你在那里有一個顯式的演員,編譯器假設程序員知道他們在做什么,因為演員就在那里並且非常在你面前。
64 位 double 僅使用 52 位來存儲數字,其余部分用於存儲符號( +
或-
)和指數。 (注意:這是IEEE754的實現, double
的實現可能在其他語言標准中有所不同)
unsigned int
(又名size_t
)使用所有 64 位來存儲數字,但沒有為指數留下空格,因此像size_t
這樣的整數沒有浮點精度
因此,編譯器會告訴您,如果您的 64 位無符號整數大於 64 位double
類型的尾數可以存儲的數量(即大於52 位),則可能會導致數據丟失,並且可能導致之后其余代碼中的未定義行為。
執行static_cast<double>(idx)
是程序員的斷言,告訴編譯器不要擔心,並且您將牢記上述預防措施。
來源: https : //en.wikipedia.org/wiki/Double-precision_floating-point_format
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.