70.1.1. ЦЕЛЫЕ ЧИСЛА И ENDIAN



THIS SECTION IS UNDER CONSTRUCTION


Целые числа Endian Integer / \ Big-Endian Little-Endian Byte sexuality.

Big endian:

Little endian:



BIG-ENDIAN LITTLE-ENDIAN word low -----> high word low ----> high addr byte address addr byte address +---+---+---+---+ +---+---+---+---+ 0 | 0 | 1 | 2 | 3 | 0 | 3 | 2 | 1 | 0 | +---+---+---+---+ +---+---+---+---+ 1 | 4 | 5 | 6 | 7 | 1 | 7 | 6 | 5 | 4 | +---+---+---+---+ +---+---+---+---+ | | | | Motorolla MC68XXX, Zilog z80, Intel x86, Itanium PowerPC, Alpha, SPARC (Network byte order) WORD 1234h: WORD 1234h: A 12h A 34h A+1 34h A+1 12h DWORD 12345678h DWORD 12345678h A 12h A 78h A+1 34h A+1 56h A+2 56h A+2 34h A+3 78h A+3 12h Удобно смотреть dump Удобно преобразовывать типы Еще существует Cross-Endian (старые DEC PDP-11 и некоторые старые VAX в режиме совместимости с PDP-11). К счастью он не бывает 64-бит, только 32-бит: ADDR 0 1 2 3 DWORD value = 12345678h +----+----+----+----+ Big-endian | 12 | 34 | 56 | 78 | 4321 Motorola +----+----+----+----+ Little-endian | 78 | 56 | 32 | 12 | 1234 Intel +----+----+----+----+ Cross-endian | 34 | 12 | 78 | 56 | 3412 PDP-11 +----+----+----+----+ Даже UNICODE бывает обоих форм. 'A' => ASCII 41h => UNICODE 0041h Big-Endian Little-Endian 00h 41h 41h 00h


Еще проблемы с битовыми полями: В ЯВУ распределение битовых полей начинается от бита 0 и идет в сторону старших битов. 0 31 BIT +-----+-----+-----+-----+ Big-endian |BF| -- > | Motorola +-----+-----+-----+-----+ 3 2 1 0 BYTE 31 0 BIT +-----+-----+-----+-----+ Little-endian | < -- |BF| Intel +-----+-----+-----+-----+ 3 2 1 0 BYTE



Пример заголовка для первого байта IPv4 пакета: (Типичное значение этого байта 45h (версия = 4, длинна заголовка = 5 DWORDs)) ------------------------------------------- struct IPv4Byte1 { #ifdef BIG_ENDIAN unsigned version:4; unsigned length:4; #else // Little-endian unsigned length:4 unsigned version:4 #endif; } ------------------------------------------- ------------------------------------------ struct a { unsigned b:12; // bits 0..11 unsigned c:4; // bits 12..15 }; main() { struct a aa; unsigned short * pc; aa.c = 0xf; aa.b = 0; pc = (unsigned short *) &aa; printf("Bitfield byte = %x\n",(int) (*pc)); } -------------------------------------------- Result is on x86: F000 Little-endian Result is on SPARC: 000F Big-endian

Index Prev Next