Возвращает ли sizeof количество байтов или число октетов типа в C?
Проще говоря, в C и вариантах (в отличие от этого wuss java с его виртуальной машиной) размер примитивных типов в разных целях может сильно различаться, и на самом деле нет никакой гарантии, если вы не используете типы фиксированной ширины, определенные в stdint.h
и даже тогда ваша реализация должна их поддерживать.
Во всяком случае, гипотетически (потому что на большинстве современных машин байт является октетом, я предполагаю (ASCII), что для работы в сети) size of возвращает размер типа данных в байтах или в октетах?
4 ответа
Ответ: sizeof
возвращает размер типа в байтах.
Пример: sizeof(char)
на 100% гарантировано 1
, но это не значит, что это один октет (8 бит).
Проверено стандартом:
в пункте 6.5.3.4, пункт 2:
Оператор size of возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках. Размер определяется по типу операнда. Результатом является целое число. Если тип операнда является типом массива переменной длины, операнд оценивается; в противном случае, операнд не оценивается, и результатом является целочисленная константа.
...
При применении к операнду, имеющему тип char, unsigned char, или 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-летнему стандарту. Я надеюсь, что этот ответ поможет взглянуть на вещи в более экзотических системах.