LINUX.ORG.RU

#include <stdio.h>
#include <endian.h>


int main()
{

#if __BYTE_ORDER == __LITTLE_ENDIAN
  puts("Little endian");
#elif __BYTE_ORDER == __BIG_ENDIAN
  puts("Big endian");
#else
  #error "Byte order of the host is unknown"
#endif

return 0;
}

nobody ★★
()
Ответ на: комментарий от nobody

а ты уверен что эти макросы есть на любой машине?
лучше так

int TestByteOrder()
{
union
{
unsigned char c[2];
unsigned short int u;
} tst;

tst.c[0]=0;
tst.c[1]=0;
tst.u=258;
if ((tst.c[0]==1) && (tst.c[1]==2)) return 1; /* big-endian */
if ((tst.c[0]==2) && (tst.c[1]==1)) return 0; /* little-endian */
return -1; /* This should not happen! Unknown integer representation */
}

anonymous
()

Да short int никто не обязует быть 16-битным :))

anonymous
()

Сорри ошибся. Читать следует так: Да и short int никто не обязует быть 16-битным :))

anonymous
()

ну тогда уж никто не сказал что все машины либо big либо little endian.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

>Читать следует так:... А какое отношение short int имеет к теме?

Murr ★★
()

Вернее, его размеры...

Murr ★★
()
Ответ на: комментарий от anonymous

>на то он и char чтоб быть 8 битным
Неа. Бывают машины отличные от писюков, с большим размером минимальной единицы адресации.
char - он один байт по определению, а байт - это минимальная единица адресации на архитектуре по определению.

Читайте стандарты.

Murr ★★
()

union
{
unsigned char c[2];
unsigned short int u;
} tst;

Вот какое. Если уж он предположил, что char=8 бит, то short int из этого кода обязан быть 16 бит :)

anonymous
()

> байт - это минимальная единица адресации на архитектуре по определению

где это такое определение??? Вы, конечно, не застали времена машин вроде БЭСМ-6, где адресуемым было только машинное слово целиком...

anonymous
()

> char - он один байт по определению - Murr(c) (закон Мурра)

Смеялся сегодня над авторами gcc. Представляете, у них там есть константы CHAR_TYPE_SIZE и MAX_CHAR_TYPE_SIZE
Сейчас пишу им письмо с требованием эти константы исключить. На основании вышеуказанного определения. Они, ламеры, о нем еще не знают.

anonymous
()
Ответ на: комментарий от anonymous

>union
>{
>unsigned char c[2];
>unsigned short int u;
>} tst;
>
>Вот какое. Если уж он предположил, что char=8 бит, то short int из этого кода обязан быть 16 бит :)
А ... это да :)

Murr ★★
()
Ответ на: комментарий от anonymous

>где это такое определение?
ISO C98/99 пункт 3.6

Murr ★★
()

> ISO C98/99 пункт 3.6

да нет там такого определения... прошу прощения за длинную цитату:

3.6 [#1] byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment

[#2] NOTE 1 It is possible to express the address of each individual byte of an object uniquely.

[#3] NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The

4 General &#65533;3.6

&#65533;ISO/IEC ISO/IEC 9899:1999 (E)

least significant bit is called the low-order bit; the most significant bit is called the high-order bit.

3.7 [#1] character <abstract> member of a set of elements used for the organization, control, or representation of data

3.7.1 [#1] character single-byte character <C> bit representation that fits in a byte

3.7.2 [#1] multibyte character sequence of one or more bytes representing a member of the extended character set of either the source or the execution environment

[#2] NOTE The extended character set is a superset of the basic character set.

3.7.3 [#1] wide character bit representation that fits in an object of type wchar_t, capable of representing any character in the current locale

anonymous
()

anonymous: ты имеешь в виду, что в ISO C99 не написано определение байта как минимально адресуемой архитектурой единицей памяти (остальное вроде согласуется)?

P.S. Похоже это определение действительно не из ISO, поищу ...

Murr ★★
()

...как-то давно мне пришлось программировать TI34010. Это был бит-адресуемый микропроцессор. В соответствии с вышеуказанным опеределением на нем 1 байт == 1 бит.

anonymous
()

ну там же в стандарте в самом начале вроде описывается виртуальная машина на которой работает Си-программа. И в этой машине char это единица измерения. Положить виртуальную машину на реальную это уже вне компетенции Стандарта.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.