2015-02-09 34 views
5

例如:Julia:如何避免自動升級類型更改?

n::Uint8 = 0x00 
x::Uint8 = n + 0x10 
ERROR: type: typeassert: expected Uint8, got Uint64 

我想這是因爲methods(+)a::Uint8, b::Uint8沒有定義,因此n是自動晉升爲Uint64。是否有更好的方法來處理這個問題,而不是在每次操作之後將所有內容都恢復爲預升級類型?這不是解釋者應該能夠自動處理的事情嗎(例如,如果在添加之後告知x應該被分配Uint8)?

+1

這種行爲是茱莉亞0.3的故意選擇,以減少溢出的風險。 – tholy 2015-02-09 11:39:48

+0

我會發現舊行爲有用的唯一情況是我認爲它並不適用(int64 - > bigint不會自動提升)。 – user3467349 2015-02-09 19:54:48

回答

7

我不認爲這是在朱莉婭0.3有更好的方式比

julia> typeof(uint8(0x00 + 0x10)) 
UInt8 

但朱莉婭0.4你不必擔心,因爲它沒有這樣做自動升級了:

julia> typeof(0x00 + 0x10) 
UInt8 
+0

啊是的,我沒有在一段時間內使用過朱莉婭 - 我只是在'0.4'試過,似乎'+'方法更小的int和uint類型被添加到發送。 – user3467349 2015-02-09 01:59:08

+1

是的,舊的行爲有一些邏輯,但我認爲對於大多數人來說,新的行爲更有意義。 – IainDunning 2015-02-09 02:27:10

+1

請注意'x + y'不檢查茱莉亞0.3或茱莉亞0.4的溢出。如果這是一個問題,在0.4上,您需要自己模擬升級行爲,例如''''爲'x'和'y'轉換(UInt8,convert(UInt16,x)+ y)''UInt8'。如果結果值溢出了'UInt8',0.4'convert'將會拋出一個錯誤。 – tholy 2015-02-09 11:42:50