n::Uint8 = 0x00
x::Uint8 = n + 0x10
ERROR: type: typeassert: expected Uint8, got Uint64
我想這是因爲methods(+)
爲a::Uint8, b::Uint8
沒有定義,因此n
是自動晉升爲Uint64
。是否有更好的方法來處理這個問題,而不是在每次操作之後將所有內容都恢復爲預升級類型?這不是解釋者應該能夠自動處理的事情嗎(例如,如果在添加之後告知x
應該被分配Uint8
)?
n::Uint8 = 0x00
x::Uint8 = n + 0x10
ERROR: type: typeassert: expected Uint8, got Uint64
我想這是因爲methods(+)
爲a::Uint8, b::Uint8
沒有定義,因此n
是自動晉升爲Uint64
。是否有更好的方法來處理這個問題,而不是在每次操作之後將所有內容都恢復爲預升級類型?這不是解釋者應該能夠自動處理的事情嗎(例如,如果在添加之後告知x
應該被分配Uint8
)?
我不認爲這是在朱莉婭0.3有更好的方式比
julia> typeof(uint8(0x00 + 0x10))
UInt8
但朱莉婭0.4你不必擔心,因爲它沒有這樣做自動升級了:
julia> typeof(0x00 + 0x10)
UInt8
啊是的,我沒有在一段時間內使用過朱莉婭 - 我只是在'0.4'試過,似乎'+'方法更小的int和uint類型被添加到發送。 – user3467349 2015-02-09 01:59:08
是的,舊的行爲有一些邏輯,但我認爲對於大多數人來說,新的行爲更有意義。 – IainDunning 2015-02-09 02:27:10
請注意'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
這種行爲是茱莉亞0.3的故意選擇,以減少溢出的風險。 – tholy 2015-02-09 11:39:48
我會發現舊行爲有用的唯一情況是我認爲它並不適用(int64 - > bigint不會自動提升)。 – user3467349 2015-02-09 19:54:48