Russian Qt Forum

Программирование => С/C++ => Тема начата: lenny от Октябрь 14, 2011, 15:36



Название: 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;
  }
}