Если вы посмотрите на фактическую память, используемую для хранения -1
в подписанном байте, вы увидите, что это 0xff
. Однако в самом языке, а не в двоичном представлении, 0xff
просто выходит за пределы для байта. Бинарное представление -1
действительно будет использовать два дополнения, но вы защищены от этой детали реализации.
Дизайнеры языка просто взяли позицию, что попытка сохранить 255 в типе данных, который может содержать только -128 до 127, следует считать ошибкой.
Вы спросите в комментариях, почему Java позволяет:
int i = 0xffffffff;
Буквальный 0xffffffff
является int
буквальным и интерпретируется с помощью дополнения до двух. Причина, по которой вы не можете сделать ничего подобного для байта, заключается в том, что язык не дает синтаксиса для указания того, что литерал имеет тип byte
или действительно short
.
Я не знаю, почему было принято решение не предлагать более буквальные типы. Я ожидаю, что это было сделано по причинам простоты. Одна из целей этого языка заключалась в том, чтобы избежать ненужной сложности.
Спасибо за понимание, что реализация является дополнением двух. Почему же тогда язык допускает 0xffff_ffff для int? – Sridhar