[英]Understanding promotions (type conversions)
除了在第一行將 0 從 int 提升為 double 之外,還有其他提升嗎?
double d=-1./0;
unsigned int *pd = (unsigned int *)&d;
printf("1:%08x\n",*++pd);
printf("2:%08x",*--pd);
.. 除了將 0 從 int 提升為 double ..
好吧,該標准沒有為此使用“促銷”一詞。 該標准使用術語“通常的算術轉換”。
標准中的術語“提升”與“整數提升”有關,並說明在應用所使用的運算符之前如何將不同的整數類型轉換為常見的整數類型。
順便說一句:使unsigned int
指針指向double
對象並取消引用它,違反了嚴格的別名規則。
根據 Ian Abbott 的評論進行編輯:
術語“提升”也用於“默認參數提升”,其中包括將函數的可變參數或沒有原型的函數的參數的 float 提升為 double。
除了在第一行將 0 從 int 提升為 double 之外,還有其他提升嗎?
不。
1.
或1.0
是double
類型的常量。-
不會改變操作數的類型,因為它不是一個小整數類型而是一個double
。0
是int
類型,並作為通常算術轉換的一部分提升為double
。/
的結果類型為double
。 這與變量d
類型相同,因此不會發生左值轉換。此處的詳細信息: 隱式類型促銷規則
與您的問題無關,將double d
取消引用為整數類型會調用未定義的行為錯誤:這違反了嚴格的別名規則。 在指向類型的末尾之外執行指針算術也是未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.