> Что такое big-endian и little-endian (Go)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: Фабрика решений
Стек: Go
> Пример ответа
Короткий ответ
Big-endian и little-endian - это два способа хранения многобайтовых чисел в памяти. В big-endian старший байт хранится первым (по младшему адресу), в little-endian - младший байт первым. Например, число 0x12345678 в big-endian будет храниться как 12 34 56 78, а в little-endian - как 78 56 34 12. Большинство современных процессоров (x86, ARM) используют little-endian, но сетевые протоколы и некоторые форматы файлов - big-endian.
Подробное объяснение
Порядок байт определяет, как интерпретируется последовательность байт при чтении многобайтового значения. Это важно при работе с бинарными данными: сетевые пакеты, файловые форматы, межпроцессное взаимодействие.
- Big-endian: старший байт (most significant byte) располагается по наименьшему адресу. Используется в TCP/IP, JPEG, PNG, Java Virtual Machine.
- Little-endian: младший байт (least significant byte) располагается по наименьшему адресу. Используется в x86, x86-64, большинстве ARM-процессоров, в форматах ELF и PE.
Порядок байт не влияет на арифметические операции внутри процессора - он важен только при сериализации данных или при чтении памяти как массива байт. Например, при чтении uint32 из []byte нужно учитывать, в каком порядке байты записаны в слайсе.
На практике
В Go порядок байт важен при:
- чтении/записи бинарных файлов и сетевых пакетов;
- работе с
encoding/binary- функцииBigEndianиLittleEndian; - взаимодействии с C-кодом через cgo, если структуры содержат многобайтовые поля;
- реализации сетевых протоколов (например, HTTP/2, DNS, TCP-заголовки - все big-endian).
Go сам по себе не зависит от порядка байт платформы для обычных переменных - компилятор генерирует код, который корректно работает на любой архитектуре. Но при конвертации между []byte и числами нужно явно указывать порядок.
Пример кода
GOpackage mainimport ("encoding/binary""fmt")func main() {var num uint32 = 0x12345678// big-endianbufBE := make([]byte, 4)binary.BigEndian.PutUint32(bufBE, num)fmt.Printf("big-endian: %x\n", bufBE) // 12 34 56 78// little-endianbufLE := make([]byte, 4)binary.LittleEndian.PutUint32(bufLE, num)fmt.Printf("little-endian: %x\n", bufLE) // 78 56 34 12// чтение обратноvalBE := binary.BigEndian.Uint32(bufBE)valLE := binary.LittleEndian.Uint32(bufLE)fmt.Printf("read back: %x %x\n", valBE, valLE) // 12345678 12345678}
Как отвечать на собеседовании
Начни с определения: порядок байт - это способ хранения многобайтовых чисел в памяти. Приведи пример с числом и покажи разницу. Затем скажи, где какой используется: little-endian - x86/ARM, big-endian - сетевые протоколы. Упомяни, что в Go порядок байт не влияет на обычные переменные, но важен при работе с encoding/binary. Если спросят про сеть - добавь, что сетевой порядок байт всегда big-endian.
Что проверяет интервьюер
- понимание базовой концепции порядка байт;
- знание, где какой порядок используется;
- умение работать с бинарными данными в Go через
encoding/binary; - осознание, что порядок байт - это проблема сериализации, а не арифметики.
Типичные ошибки
- путать, где старший байт, а где младший;
- думать, что порядок байт влияет на вычисления внутри процессора;
- забывать, что сетевой порядок байт - big-endian;
- использовать
binary.NativeEndianбез необходимости - он зависит от платформы и делает код непереносимым; - читать
uint32из[]byteчерезunsafeили приведение типов без учёта порядка байт.
> Похожие задачи по backend
Как сериализовать данные в последовательность байт в Go
Как был организован процесс тестирования
Как организовано тестирование в команде
Какие технологии и стеки вам интересны
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью