Почему нельзя прибавить значение типа UInt8 к Int?

Максимальное число UInt8 равно 255, значит мы никогда не присвоим значение больше чем может вместить Int. Следовательно почему для того чтобы это сделать нам необходимо обязательно менять тип UInt8 в Int?

Пример того что я хочу сделать на языке Swift:

let value_UInt8: UInt8 = 5
var value_Int: Int = 5
value_Int += value_UInt8 // Error Replace 'value_UInt8' with 'Int(value_UInt8)'

Ответы (2 шт):

Автор решения: VAndrJ

Swift - язык с сильной статической типизацией. Это значит, что нельзя смешивать различные типы, так как не выполняются автоматические неявные преобразования.

UInt8 и Int - разные типы, соответственно, преобразования нужно выполнять явно.


Теоретически конечно же можно всё. Ближайший аналог по Вашему примеру – ограниченное неявное приведение типов в Java:

byte a = 1; // Swift Int8.
int b = 1000;
int c = a + b; // Допустимо
byte d = a + b; // Недопустимо.

В случае int c = a + b byte никак не может выйти за пределы int, соответственно, здесь неявно приводится и получаем сумму int и byte.
В случае же byte d = a + b int выходит за пределы byte и как поступить в этом случае? Отбросить лишнее и оставить 128? Упасть программе во время исполнения? Отбросить "лишние" биты? Все это очень плохо и дополнительный источник ошибок. Поэтому решение этой ситуации возлагается на пишущего программу.

В Python, к примеру, можно умножить массив на число:

[1, 2] * 3 // Получим [1, 2, 1, 2, 1, 2]

Насколько это логично? Ну кому как.

Существуют языки в которых есть неявное приведение между всеми типами. Но страшно представить сколько это влечет за собой источников ошибок.

В общем, у каждого языка свои особенности. Но чем больше свободы дает сам язык – тем больше возможных источников ошибок и сложнее поддерживать написанное в будущем.

→ Ссылка
Автор решения: Тарас Атавин

Разрядность int больше 8-ми бит, разрядность uint8_t ровно 8 бит. А где процессору брать недостающие биты для сложения? Поэтому формально так делать нельзя. А как можно? Можно сначала привести оба слагаемых к одному типу, а потом уже складывать. Будет приведение явным или неявным – вопрос отдельный. Если компилятор ругается, то успокойте его явным привидением.

→ Ссылка