2015-02-09 2 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

Такое поведение было преднамеренным выбором в julia 0.3, чтобы уменьшить риск переполнения. – tholy

+0

Единственным случаем, для которого я бы нашел полезное старое поведение, я думаю, что тот, для которого он не применим (int64 -> bigint не автопродвигает). – user3467349

ответ

7

Я не думаю, что есть лучший способ Юли 0,3 чем

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

но Джулии 0,4 вам не нужно беспокоиться, как это не делает этого автоматического продвижения больше:

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

Ах да, я не использовал Джулию через некоторое время - я просто попробовал ее в '0.4', кажется, что методы' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – user3467349

+1

Да, была некоторая логика для старого поведения, но я думаю, что для большинства людей новое поведение имеет больше смысла. – IainDunning

+1

Обратите внимание, что 'x + y' не проверяет переполнение на julia 0.3 или julia 0.4. Если это проблема, то на 0.4 вам нужно будет подражать поведению продвижения самостоятельно, например, 'convert (UInt8, convert (UInt16, x) + y)' для 'x' и' y' как 'UInt8'. В 0,4 'convert' будет вызывать ошибку, если результирующее значение переполняет' UInt8'. – tholy

Смежные вопросы