1- Что писатель означает, по длине слов
Слово является основной ячейкой памяти, как a page - на самом деле, есть статья on word тоже, что я не пересказываю. Значение для C, как ваш автор, говорит о том, что это не всегда одно и то же, но оно определяется характеристиками оборудования. Возможно, это одна из причин, по которой стандарт C не диктует буквальный размер базовых типов; наиболее очевидным из них является размер указателей, которые будут 4 байта в 32-битных системах и 8 на 64-битных системах, чтобы отразить размер адресного пространства.
2- Почему короткие и длинные типы данных по своей природе не переносятся.
Более точно: они, как переносимый C но их размер не нормируется, которые могут сделать их бесполезными для многих применений, где требуется фиксированный определенный размер.
3- Является ли typedef директивой микропроцессора, и если это то, что является его функцией?!
Нет, это не директива процессора. Это приятный кусок syntactic sugar, который позволяет вам определять пользовательские типы.
4- Могу ли я написать typedef unsigned char (ничего) вместо typedef unsigned char INT8U;
Да, это идея. Помните, что стандарт C даже не определяет размер символа, хотя я никогда не слышал о реализации, где это ничего, кроме 8 бит [но кто-то в комментариях имеет].
5- Почему авторский код typedef unsigned char INT8U; а затем #define UBYTE INT8U не могу использовать этот непосредственно typedef unsigned char UBYTE;
Вы могли бы, да. Возможно, автор хотел ограничить количество мест, где такой тип определен. Поскольку использование #define
является предпроцессорной директивой, оно также может слегка упростить исполняемый файл (хотя и не до такой степени, который можно было бы считать общезначимым).
6- Существует двойной тип typedef unsigned char, один из которых - typedef unsigned char INT8U; и другой typedef unsigned char BOOLEAN; Почему он это сделал?!
Опять же, использование typedefs много о «сахаре»; они могут сделать ваш код более чистым, более легким для чтения и (предположительно, они выполнены правильно), более надежными. «Boolean» - это выраженный в математике термин CS для типа, который имеет только два значимых значения, ноль (false) или не равен нулю (true). Таким образом, теоретически можно было бы реализовать всего лишь один бит, но это нелегко и, в конце концов, эффективно (потому что нет процессоров с 1-битными регистрами, в любом случае им придется нарезать кости и подделку). Определение типа «bool» или «boolean» является обычным в C и используется для обозначения того, что значение значения является либо истинным, либо ложным - оно хорошо работает с, например, if (var)
(true) и if (!var)
(false), так как C уже оценивает этот способ (0 и NULL - это единственные значения, которые пройдут if (!var)
). Принимая во внимание, что использование чего-то типа INT8U
указывает, что вы имеете дело со значением, которое варьируется от десятичного от 0 до 255, так как оно без знака. Я думаю, что введение U
аванса является более распространенной практикой (UINT8
), но если вы привыкли к концепциям, то это достаточно понятно. И, конечно, typedef/define не сложно проверить.
О stdint.h
целочисленных типов являются те, с наибольшим диапазоном изменения, а на самом деле стандарт ISO C требует, чтобы реализация включает в себя определения для целочисленных различных типов с определенными минимальными размерами в stdint.h
. У них есть имена, такие как int_least8_t
. Конечно, для многих вещей требуются типы с реальным размером (а не только минимум), и большинство распространенных реализаций предоставляют их. В стандарте C99 указывается, что если они доступны, они должны быть доступны через имена по шаблону intN_t
(подписано) и uintN_t
(без знака), где N
- это количество бит. Подписанные типы также указаны как two's complement, поэтому можно работать с такими значениями во всех видах высоконагруженных способов.
Как последнее замечание, хотя я не знаком с MicroC, я бы не взял эту документацию как представитель C вообще - она предназначена для использования в несколько ограничительной и специализированной среде (16-битный int, подразумеваемый typedefs, необычен, поэтому, если вы запустили этот код в другом месте, INT16U может быть 32-битным и т. д.). Я бы предположил, что MicroC соответствует только ANSI C, который является самым старым и самым минимальным стандартом; очевидно, у него нет stdint.h.
Не могли бы вы ответить на вопросы 5 и 6 тоже! @goldilocks –
5- Я не читал бы слишком много в технике автора здесь. Это всего лишь вопрос предпочтения человека. Автор использовал typedef для определения типов данных фиксированной ширины, а затем использовал макросы для связывания другого набора терминов (BYTE, WORD и т. Д.) С типом данных фиксированной ширины. Да, вы можете использовать typedef для определения BYTE и WORD, если это ваше предпочтение. – kkrambo
6- Автор хотел определить типы данных для 8-разрядной переменной ширины и логического (одноразрядного), потому что это может потребоваться для любой конкретной абстракции программного обеспечения. Он планирует написать код на уровне абстракции выше базового типа данных. Поэтому, когда его код требует переменной TRUE/FALSE, он будет использовать Boolean. И когда его код требует 8-битной переменной, он будет использовать INT8U. Оба эти типа оказываются одинаковыми, но использование абстрактных типов добавляет больше значения в исходный код. Когда вы просмотрите его код и увидите логическое значение, вы узнаете, что это переменная TRUE/FALSE. – kkrambo