簡體   English   中英

是轉換int - > unsigned long long由標准定義

[英]Is conversion int -> unsigned long long defined by the standard

我無法找到標准中如何將int值轉換為unsigned long long的確切規范。 各種類似的轉換,例如int - > unsigned,unsigned - > int(UB if negative),unsigned long long - > int等被指定

例如GCC, -1轉換為0xffffffffffffffff ,而不是0x00000000ffffffff 我可以依靠這種行為嗎?

是的,這是明確定義的,它基本上是將max unsigned long long + 1-1 ,這將始終是max unsigned long long 這在C ++標准草案4.7節“ 積分轉換”中有所介紹:

如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2 n ,其中n是用於表示無符號類型的位數)。 [注意:在二進制補碼表示中,此轉換是概念性的,並且位模式沒有變化(如果沒有截斷)。 - 尾注]

它與C99完全相同,但從第6.3.1.3節有符號和無符號整數開始C99標准草案更容易理解:

否則,如果新類型是無符號的,則通過重復地添加或減去一個可以在新類型中表示的最大值來轉換該值,直到該值在新類型的范圍內。 49)

腳注49說:

規則描述了數學值的算術,而不是給定類型的表達式的值。

是的,它的定義是:

C ++11§4.7[conv.integral] / 2說:

如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2 n ,其中n是用於表示無符號類型的位數)。

無符號整數最小為-1(模2 sizeof(unsigned long long) )是unsigned long longunsigned long long

無符號整數保證模運算。 = K*2 + , where K is either 0 or 1, and where n is the number of value representation bits for unsigned long . 因此,任何intv被轉換為unsigned longu ,使得 = K * 2 + ,其中K是0或1,並且其中nunsigned long整數的值表示位數。 . 換句話說,如果v為負數,則只需加2


2的冪來自C ++標准的要求,即整數用純二進制系統表示。 . 對於n值表示位,可能值的數量是2 浮點類型沒有這樣的要求(您可以使用std::numeric_limits來檢查浮點值表示的基數)。


還要注意,為了迎合一些現在過時的平台,以及一個以自己的方式做事的流行編譯器,當無符號值不能直接表示為有符號值時,標准將相反的轉換保留為未定義的行為。 實際上,在現代系統中,可以告訴所有編譯器使反向轉換與轉換為無符號類型完全相反,例如,Visual C ++默認情況下會這樣做。 但是,值得記住的是,沒有正式的支持,因此便攜式代碼會產生輕微的(現在的計算機不必要)效率低下。

暫無
暫無

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

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