Почему нельзя прибавить значение типа 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 шт):
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 бит. А где процессору брать недостающие биты для сложения? Поэтому формально так делать нельзя. А как можно? Можно сначала привести оба слагаемых к одному типу, а потом уже складывать. Будет приведение явным или неявным – вопрос отдельный. Если компилятор ругается, то успокойте его явным привидением.