2016-06-16 46 views
11

我想了解一些數據類型和轉換之間的區別。將long.MaxValue轉換爲int並將float.MaxValue轉換爲int有什麼區別?

public static void ExplicitTypeConversion2() 
    { 
     long longValue=long.MaxValue; 
     float floatValue = float.MaxValue; 
     int integerValue = (int) longValue; 
     int integerValue2 = (int)floatValue; 
     Console.WriteLine(integerValue); 
     Console.WriteLine(integerValue2);    
    } 

當我運行的代碼塊,它輸出:

-1 
-2147483648 

我知道,如果你想分配給一個整數的值大於該整數可以保持,它返回最小值的整數(-2147483648)。

據我所知,long.MaxValue比整數的最大值大得多,但是如果我把long.MaxValue轉換成int,則返回-1。

這兩個鑄件有什麼區別?我認爲第一個也假設返回-2147483648而不是-1。

+1

我想知道的其他方式輪....'INT I =(int)的long.MaxValue'填充'i'用'0xFFFFFFFF'這是'-1',所以我很清楚。我想知道爲什麼'int i =(int)float.MaxValue'結束於'0x80000000'的int.MinValue。 –

回答

2

讓我解釋一下:

long longValue=long.MaxValue; 
float floatValue = float.MaxValue; 
int integerValue = (int) longValue; 
int integerValue2 = (int)floatValue; 

長的最大值是9,223,372,036,854,775,807或0x7FFFFFFFFFFFFFFF,減少它變成爲0xFFFFFFFF將返回00000001負的符號位,表示爲十進制-1因此,後2的補數。

另一方面,float的最大值是3.40282347E + 38,因此將其轉換爲int,將值四捨五入爲3E + 38,並在減少後使用2的補碼,得到十六進制值0x80000000並帶有負號位,十進制有-2147483648。

所有這些情況適用於帶符號整數,結果將在不帶符號的整數上有所不同。

參考:

https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.single.maxvalue(v=vs.110).aspx

+0

關於從float到int的轉換的說法不正確。您的語句「3.40282347E + 38,因此將其轉換爲int將值四捨五入爲3E + 38」僅在紙和筆上正確,而不是在計算機 – AhmadWabbi

+0

它全部相當於內部表示... 64位Long.Maxvalue到32位int的十六進制中繼是** 0xFFFFFFFF **,在2的補碼上有符號整數表示中是-1。逐位表示爲** 0x7FFFFFFF **的float.maxvalue在二進制補碼錶示中依次等於Integer.maxvalue。 –

+0

@JoãoRebelo具有位模式0x7FFFFFFF的浮點數是NaN,而內部表示形式對float-> int類型無關緊要 – harold

6

long.MaxValue的二進制值是0111...111111(零後跟63個)。當您投射到int時,您保留最低32位111...11111。這是十進制的-1,因爲intsigned並且適用了二進制補碼。

+0

在十進制中,它應該是「4294967295」,但是因爲Int32的最大值是2147483647,所以當它到達時,它從-2147483648(它的最小值)開始計數,然後確實達到-1。 –

+0

@PaulWeiland號碼如果是'unsigned',則值將是'4294967295'。但是由於'int'是'signed',所以在二進制補碼中32個1的序列等於'-1'。 – AhmadWabbi

15

,如果你想分配給一個整數的價值,比整數大可以繼續,返回整數

的最小值這不是一個規則。有關規則是

對於整數類型在unchecked上下文(即,默認值):

如果源類型比目標類型時,則源值由 丟棄它的「額外截斷「最重要的位。然後將結果視爲目標 類型的值。

對於浮子> INT在unchecked上下文:

值向零舍入到最接近的整數值。如果該整數值在目標類型的範圍 以內,則該值是轉換的結果。 否則,轉換的結果是目標類型的未指定值。

斬掉32位領先位0x7fffffffffffffff給出0xffffffff又名-1。

你從來沒有答應過你會得到int.MinValue對於超出範圍浮子> INT演員,但你無論如何,因爲它很容易實現:64位的轉換指令cvtss2si使得爲0x80000000超出範圍的結果,同樣fistp(老由32位JIT使用的x87轉換指令)存儲0x80000000的「整數不定值」。

+0

在C#中基於十六進制格式的鑄造作品? 0x7fffffffffffffff或二進制後臺?我的意思是例如從一個類型轉換到另一個,如果我將它的值轉換爲二進制來檢查其他類型的位數,所以決定我是否可以保留或丟失數據 – Tuncaf

+0

@Tuncaf在幕後沒有格式。十六進制和二進制只是兩種同樣好的方式來可視化發生了什麼(但十六進制更短,這是我選擇它的唯一原因)。 – harold

+0

謝謝@horald – Tuncaf