Russian Qt Forum
Ноябрь 23, 2024, 11:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: int8_t, int16_t, uint32_t и т.п. стандарт регламентирует?  (Прочитано 33024 раз)
lenny
Гость
« : Октябрь 14, 2011, 15:36 »

Не могу найти в ISO/IEC 14882 ничего про эти типы.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 14, 2011, 16:54 »

это вроде как сугубо юниксовские типы. объявлены в stdint.h
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
antzol
Гость
« Ответ #2 : Октябрь 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
 
Записан
lenny
Гость
« Ответ #3 : Октябрь 14, 2011, 18:15 »

Спасибо! Странно, что в стандарте об этом ничего не написано. Насколько помню они были почти во всех компиляторах.
Записан
lenny
Гость
« Ответ #4 : Октябрь 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] = ?;
Меня вся это байда в духе си выводит из себя.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Октябрь 14, 2011, 19:13 »

Код
C++ (Qt)
y[8] = x & 127; // lower
y[9] = x >> 7; // upper
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lenny
Гость
« Ответ #6 : Октябрь 14, 2011, 19:14 »

Спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 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);
 
« Последнее редактирование: Октябрь 14, 2011, 19:18 от Igors » Записан
lenny
Гость
« Ответ #8 : Октябрь 14, 2011, 19:19 »

По чему (unsigned) short "железно" 2 байта? Что за ендиана?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 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] младший. Хотя конечно, это уже "дань истории", больше таких процессоров не выпускают.
Записан
lenny
Гость
« Ответ #10 : Октябрь 14, 2011, 20:26 »

Понял о чем ты, все верно.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #11 : Октябрь 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;
  }
}
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.444 секунд. Запросов: 23.