Понимание целочисленных типов фиксированной ширины - PullRequest
0 голосов
/ 04 июля 2018

Я понимаю идею типов фиксированной ширины, но меня немного смущает объяснение, приведенное в ссылке:

целочисленный тип со знаком с шириной ровно 8, 16, 32 и 64 бита соответственно без битов заполнения и использования дополнения 2 для отрицательных значений (предоставляется только если реализация напрямую поддерживает тип)

Итак, насколько я понимаю, если я смог скомпилировать приложение, все должно работать на платформах, которые могут его запустить. Есть мои вопросы:

  1. Что если какая-то платформа не обеспечивает поддержку этих типов? Используется ли какое-либо выравнивание или приложение может вообще не работать?
  2. Если у нас есть гарантия, что sizeof(char) - это ровно один байт на каждой платформе, независимо от размера байта, который может быть различным на разных платформах, означает ли это, что int8_t и uint8_t гарантированно будут доступны везде?

1 Ответ

0 голосов
/ 04 июля 2018

Если реализация не предоставляет используемый вами тип, он не будет существовать и ваш код не будет компилироваться. В этом случае потребуется ручное портирование.

Относительно вашего второго вопроса: хотя мы знаем, что sizeof(char) == 1, не гарантируется, что char имеет ровно восемь битов; это может иметь больше, чем это. Если это так int8_t и друзей не будет.

Обратите внимание, что существуют другие типы, которые могут предоставить достаточные гарантии для вашего варианта использования, если вам не нужно знать точную ширину, например int_least8_t или int_fast8_t. Те оставляют реализацию немного больше свободы, делая их более портативными.

Однако, если вы нацеливаетесь на платформу, на которой не существует общих целочисленных типов, вы должны знать об этом заранее; так что не стоит тратить слишком много времени на решение наиболее вероятных не относящихся к делу проблем. Эти платформы относительно экзотичны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...