Ли оператор sizeof возвращает количество байтов или количество октетов типа в C?

проще говоря, в C и вариантах (в отличие от Wuss java с его виртуальной машиной) размер примитивных типов на разных целях может сильно отличаться, и нет никакой гарантии, если вы не используете типы фиксированной ширины, определенные в stdint.h, и даже тогда ваша имплементация должна их поддерживать.

в любом случае гипотетически (потому что на большинстве современных машин байт является октетом, для сетевых целей я предполагаю (ASCII)) sizeof возвращает размер типа данных в байтах или в октеты?

4 ответов


ответ: sizeof возвращает размер типа в байт.


пример: sizeof(char) 100% гарантированно будет 1, но это не значит, что это один октет (8 бит).


доказано стандартом:

в пункте 6.5.3.4, пункт 2:

оператор sizeof возвращает размер (в байтах) своего операнда, который может быть выражение или имя типа, заключенное в скобки. Размер определяется тип операнд. Результатом является целое число. Если тип операнда-массив переменной длины тип, операнд вычисляется; в противном случае операнд не вычисляется и результат целочисленная константа.

...

при применении к операнду с типом char, unsigned char или signed char, (или его квалифицированная версия) результат равен 1. При нанесении операнда массива типа, результат общее количество байтов в массиве) при применении к операнду который имеет структуру или тип объединения, результатом является общее количество байтов в таком объекте, включая внутреннюю и отставая прокладку.

также, в разделе 3.6, пункт 3:

байт состоит из последовательности битов, количество которых определяется реализацией


sizeof дает размер в байтах. Однако обратите внимание, что" байт " является техническим термином в стандарте C и определяется так, что sizeof(char) == 1.


sizeof всегда возвращает количество байт. Но согласно Википедия:

в языках программирования C и c++ унарный оператор sizeof используется для вычисления размера любого типа данных, измеряемого количеством байтов, необходимых для представления типа. Байт в этом контексте совпадает с беззнаковым символом,и может быть больше 8 бит, хотя это редко.


из моего собственного опыта, работая над встроенными микроконтроллерами с экзотическими компиляторами "C", я видел:

sizeof( uint8 )

возвращает 1

sizeof( uint16 )

возвращает 1

sizeof( uint32 )

возврат 2

ясно, что я имел дело с машиной, наименьшая адресуемая сущность была 16 бит, поэтому sizeof не соответствует C89 или C99.

Я бы сказал, что в основных системах, совместимых с C89 и C99, принятый ответ правильный. К сожалению, Компилятор " C "по-прежнему можно назвать компилятором" C", даже если он не соответствует 25-летнему стандарту. Я надеюсь, что этот ответ поможет взглянуть на вещи в перспективе, учитывая более экзотические системы.