LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

потому что выражение

long1 = int1 + int2;

транслируется в

mov reg_int, int1
add reg_int, int2
mov long1, reg_int

а вот выражение

long1 = (long)int1 + int2;

в

mov reg_long, int1
add reg_long, int2
mov long1, reg_long

выбор разрядности делается по типу операндов. а не по типу результата.

пример - длинное сложное выражение навроде

long = (int + int*(short / short) * int) / int...

по вашей логике поскольку результат - long - то все выражение надо считать в long?… это логика неправильная. длина и сложность выражения ничем не ограничена. и считается оно в текущей разрядности операндов(самого длинного в данной бинарной операции ).

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

Исходная версия alysnix, :

потому что выражение

long1 = int1 + int2;

транслируется в

mov reg_int, int1
add reg_int, int2
mov long1, reg_int

а вот выражение

long1 = (long)int1 + int2;

в

mov reg_long, int1
add reg_long, int2
mov long1, reg_long

выбор разрядности делается по типу операндов. а не по типу результата.

пример - длинное сложное выражение навроде

long = (int + int*(short / short) * int) / int.

по вашей логике поскольку результат - long - то все выражение надо считать в long?… это логика неправильная. длина и сложность выражения ничем не ограничена. и считается оно в текущей разрядности операндов(самого длинного в данной бинарной операции ).

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