簡體   English   中英

將負浮點值轉換為無符號int的行為是什么?

[英]What is the behaviour on converting a negative floating point value into an unsigned int?

如果將負浮點值轉換為無符號整數類型的值會怎樣? 標准報價將不勝感激。 我面臨的問題是從包含浮點類型對象的變量類轉換為無符號整數類型的值。

例:

unsigned i = -.1;

如果負值為-1.0或更低,則它將調用未定義的行為,因為整數部分然后不能用無符號數字表示。 否則,(如-0.1的情況),如果可以用整數類型表示,則它是明確定義的行為。 請參閱C11標准,ISO 9899:2011:

6.3.1.4

當實數浮點型的有限值轉換為_Bool以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 如果整數部分的值不能用整數類型表示,則行為是不確定的。 61)

然后有一個非規范性的腳注解釋了上面的文本:

61)當將整數類型的值轉換為無符號類型時,無需執行余數運算。 因此,可移植實際浮點值的范圍是(-1,Utype_MAX + 1)。

ISO / IEC 9899:1999(C99)包含完全相同的文本。

如果浮點數小於或等於-1.0,則在C99中是未定義的行為。 如果在(-1.0,0.0)范圍內,則結果值為0。

根據C99,第6.3.1.4節第1段

當實數浮點型的有限值轉換為_Bool以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 如果整數部分的值不能用整數類型表示,則行為不確定

腳注50闡明了(-1.0,0.0)范圍內的行為。

您的示例, unsigned i = -.1; 由C11和C99 定義良好 ,結果為i == 0

引用自N1570 6.3.1.4實數浮點數和整數:

  1. 當實數浮點型的有限值轉換為_Bool以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 如果整數部分的值不能用整數類型表示,則行為是不確定的(61)。

61)當將整數類型的值轉換為無符號類型時,無需執行余數運算。 因此,可移植實際浮點值的范圍是(-1,Utype_MAX + 1)。

引用自N869 6.3.1.4實數浮點數和整數:

#1

當實數浮點型的有限值轉換為_Bool以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 如果整數部分的值不能用整數類型表示,則行為是不確定的(43)。

43)當將整數類型的值轉換為無符號類型時,無需執行余數運算。 因此,可移植實際浮點值的范圍是(-1,Utype_MAX + 1)。

但是,從引號中可以看到,嘗試轉換超出范圍(-1,Utype_MAX + 1)的浮點常量會調用未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM