> Что такое 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 и числами нужно явно указывать порядок.

Пример кода

GO
package main
import (
"encoding/binary"
"fmt"
)
func main() {
var num uint32 = 0x12345678
// big-endian
bufBE := make([]byte, 4)
binary.BigEndian.PutUint32(bufBE, num)
fmt.Printf("big-endian: %x\n", bufBE) // 12 34 56 78
// little-endian
bufLE := 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 или приведение типов без учёта порядка байт.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью