簡體   English   中英

double to unsigned int / char

[英]double to unsigned int / char

在這里讀到:

根據C99§6.3.1.4腳注50:

當將實數浮點類型的值轉換為無符號類型時,無需執行將整數類型的值轉換為無符號類型時執行的剩余操作。 因此,便攜式實際浮動值的范圍是(-1,Utype_MAX + 1)。

現在,我對以下之間的細微差別感興趣(這次是C ++ 03 !)

double d1 = 257;
double d2 = -2;

unsigned char c1 = d1; // undefined, since d1 > 256
unsigned char c2 = d2; // undefined, since d2 < -1

double d1 = 257;
double d2 = -2;

unsigned int i1 = d1; // defined, since d1 <= 2^32
unsigned int i2 = d2; // still undefined, right?

unsigned char c1 = i1; // defined, modulo 2^8, so c1 == 1

所以第一個c1和第二個c1不能保證比較相等,對嗎? 上面的引用是否也適用於C ++ 03,還是有其他規則?

編輯:

並且為了使c2定義(對於-(2^31-1) <= d2 < 0 ),這是必要的嗎?

double d2 = -2;
int sign = (d2<0 ? -1 : 1);

unsigned char c2 = sign * (int)abs(d2); // defined, c2 == 2^8-2 ?

是的,同樣的規則適用於C ++。 (但是,我將遵循2010年的C ++標准草案; C ++ 2003已經過時了。而且,我使用的是N3092,而不是官方草案。)第4.9條第1款說“如果截斷值不能,則行為未定義以目的地類型表示。“

無符號整數運算確實包裝; 它以模數1的最大值模數執行。 但是,這適用於類型內的算術。 從浮點到無符號整數的轉換不屬於此。

轉換d2代碼似乎比必要的更復雜。 如果d2int的范圍內,你可以簡單地使用unsigned char c2 = (int) d2; (雖然從intunsigned int轉換也在同構無符號整數運算之外,但是這個轉換的規范確實說它的減少方式與無符號整數運算相同。)

暫無
暫無

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

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