Вначале ваш вопрос выглядел просто, однако, немного разобрав его, я нашел концепцию, о которой раньше не слышал - неявное приведение типов
Как вы указали, объем памяти, взятый для int и longотличается: int - длинное 32-разрядное целое число со знаком - 64-разрядное целое число со знаком
И проблема в назначении длинного значения для int из-за разницы в размере. компилятор не будет выполнять числовые операции с вашим длинным значением, чтобы проверить, может ли оно вписаться в 32-разрядное целое число со знаком. например, число 1 по-разному представлено в памяти:
int 1 равно «00000000 00000000 00000000 00000001» (32-разрядный).
long 1 равно «00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001»"(64-разрядный).
, поэтому мы не можем выполнить неявное приведение типов к типам данных, которые не совместимы. Преобразование long int в int приведет к сбросу лишних старших битов.
Однакообратный путь применим! это называется неявным приведением типа или продвижением типа, и из-за этого вы можете присвоить int длинной переменной.
типы примитивов java в глубину https://www.ntu.edu.sg/home/ehchua/programming/java/J2_Basics.html
о продвижении типов http://www.java2s.com/Tutorials/Java/Data_Types/What_is_Java_type_promotion.htm