Ли оператор 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-летнему стандарту. Я надеюсь, что этот ответ поможет взглянуть на вещи в перспективе, учитывая более экзотические системы.