Название: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 15:36
Не могу найти в ISO/IEC 14882 ничего про эти типы.
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: kambala от Октябрь 14, 2011, 16:54
это вроде как сугубо юниксовские типы. объявлены в stdint.h
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: antzol от Октябрь 14, 2011, 17:59
Они фигурируют только в одном месте. 18 Language support library 18.4 Integer types 18.4.1 Header <cstdint> synopsis C++ (Qt) namespace std { typedef signed integer type int8_t; // optional typedef signed integer type int16_t; // optional typedef signed integer type int32_t; // optional typedef signed integer type int64_t; // optional typedef signed integer type int_fast8_t; typedef signed integer type int_fast16_t; typedef signed integer type int_fast32_t; typedef signed integer type int_fast64_t; typedef signed integer type int_least8_t; typedef signed integer type int_least16_t; typedef signed integer type int_least32_t; typedef signed integer type int_least64_t; typedef signed integer type intmax_t; typedef signed integer type intptr_t; // optional typedef unsigned integer type uint8_t; // optional typedef unsigned integer type uint16_t; // optional typedef unsigned integer type uint32_t; // optional typedef unsigned integer type uint64_t; // optional typedef unsigned integer type uint_fast8_t; typedef unsigned integer type uint_fast16_t; typedef unsigned integer type uint_fast32_t; typedef unsigned integer type uint_fast64_t; typedef unsigned integer type uint_least8_t; typedef unsigned integer type uint_least16_t; typedef unsigned integer type uint_least32_t; typedef unsigned integer type uint_least64_t; typedef unsigned integer type uintmax_t; typedef unsigned integer type uintptr_t; // optional } // namespace std
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 18:15
Спасибо! Странно, что в стандарте об этом ничего не написано. Насколько помню они были почти во всех компиляторах.
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 18:40
Нашел! Правда, в ISO/IEC 9899. Предположу, что во всех компиляторах C++ будет. В ISO 14882 слишком сильно абстрагировались от размера байта. Помогите!!! Я тут перегрелся, как нормально разделить short(int16_t) на два char(int8_t). То есть есть int16_t и два int8_t, надо разместить значение из int16_t в два int8_t, на расположение отдельных байт придется пока забить. short x = 0x00A3; char y[12]; y[8] = ?; y[9] = ?;
Меня вся это байда в духе си выводит из себя.
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: kambala от Октябрь 14, 2011, 19:13
C++ (Qt) y[8] = x & 127; // lower y[9] = x >> 7; // upper
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 19:14
Спасибо!
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: Igors от Октябрь 14, 2011, 19:16
short x = 0x00A3; char y[12]; y[8] = ?; y[9] = ?;
Меня вся это байда в духе си выводит из себя. Да нормальная байда :) По поводу (unsigned) short - он "железно" 2 байта (вот long - др. дело, на OSX можно получить по ушам между 32/64). Поэтому (даже не связываясь с ендианой) C++ (Qt) union Arr { char y_char[12]; short y_short[6]; }; inline short MkShort( int lo, int hi ) { return short((hi << 8) | lo); } .. Arr myArr; ... myArr.y_short[4] = some_value; // или myArr.y_short[4] = MkShort(0, 0xA3);
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 19:19
По чему (unsigned) short "железно" 2 байта? Что за ендиана?
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: Igors от Октябрь 14, 2011, 19:40
По чему (unsigned) short "железно" 2 байта? Что за ендиана?
Лучше сказать "почему", а то "по чему" провоцирует ответ "по кочану" :) Просто потому что я видел это на OSX, Линукс и Вындоуз. По крайней мере теоретически возможна платформа (напр для игровой приставки) где размер short будет иным - ну в том случае портировать и переделывать код придется так или иначе. C++ (Qt) y[8] = x & 127; // lower y[9] = x >> 7; // upper
Это неверно для старого процессора PowerPC (big endian), там y[8] старший байт, а y[9] младший. Хотя конечно, это уже "дань истории", больше таких процессоров не выпускают.
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lenny от Октябрь 14, 2011, 20:26
Понял о чем ты, все верно.
Название: Re: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?
Отправлено: lesav от Октябрь 15, 2011, 08:56
Можно создать кросспроцессовый код C voud testEndianMachine() { union // Used for endian check, defines big endian layout { short int16Word; struct { char high; char low; } bytes; }; union // Used for float endian check, defines big endian layout { float float32Value; struct { unsigned int sign : 1; unsigned int exponent: 8; unsigned int fraction0: 7; unsigned int fraction1: 16; } number; }; int16Word = 0x1234; // Magic value to detect endianess float32Value = -1.0; // Magic value to detect endianess // // Endian check for integer words // if (bytes.high == 0x34) // Little endian { bigEndianMachine = 0; } else // Big endian { bigEndianMachine = 1; } // // Endian check for floats // if (number.sign) // Big endian { bigEndianFloatMachine = 1; } else // Little endian { bigEndianFloatMachine = 0; } }
|