Сколько байт занимает тип long в Java
Что проверяют
Базовое знание примитивов и готовность говорить не только про число байт, но и про диапазон, переполнение и разницу между long и Long. Вопрос дежурный, по нему судят, твёрдо ли стоит фундамент, прежде чем переходить к сложному.
Как отвечать
long занимает 8 байт, то есть 64 бита, тип знаковый, диапазон от минус двух в шестьдесят третьей степени до двух в шестьдесят третьей минус единица. Размер зафиксирован спецификацией и не зависит ни от платформы, ни от разрядности JVM: этим Java отличается от C, где размеры типов плавают. В коде это Long.BYTES, равное 8, и Long.SIZE, равное 64. Литерал требует суффикса: long x = 10000000000L; без L не скомпилируется, потому что по умолчанию целочисленный литерал имеет тип int.
Дальше стоит добавить пару вещей, которые обычно спрашивают следом. Беззнакового long в языке нет, но есть методы, трактующие те же 64 бита как беззнаковые: Long.divideUnsigned, Long.compareUnsigned, Long.toUnsignedString. Обёртка Long весит заметно больше восьми байт и кэширует маленькие значения, из-за чего сравнение через == «работает» на числах до сотни и ломается на больших.
Где спотыкаются
Говорят, что размер зависит от разрядности системы. Зависит размер ссылки, а примитивы в Java фиксированы: int всегда 4 байта, long всегда 8, на любой JVM.
Второе: считают, что раз тип помещается в машинное слово, чтение и запись атомарны. Спецификация разрешает выполнять операции с long и double в два приёма, поэтому без volatile или AtomicLong можно прочитать половину старого значения и половину нового.
Третье: ловят переполнение на ровном месте. В выражении long ms = 24 * 60 * 60 * 1000 * 1000; арифметика идёт в int и переполняется до присваивания. Расширение до long нужно начинать с первого операнда: 24L * 60 * 60 * 1000 * 1000.