Почему sizeof(long long) возвращает 8?

Я новичок в C. sizeof(long) возвращает 8, потому что размер long составляет 8 байт (4 байта для 32-разрядной ОС).

Но мне интересно, почему sizeof(long long) тоже равно 8. Разве не должно быть 16?

#include <stdio.h>
#include <stdint.h>

int main() {
  printf("%zu\n", sizeof(unsigned long));
  printf("%zu\n", sizeof(unsigned long long));

  return 0;
}

person dinindu    schedule 20.06.2021    source источник
comment
Может быть, эта статья о типах данных C прольет вам свет? Обратите внимание на ..содержащий по крайней мере.... Это зависит от компилятора.   -  person fpiette    schedule 20.06.2021
comment
Потому что на вашей платформе long равно 8, а long long равно 8. На моей платформе int равно 8, long равно 16, а long long равно 32. На чьей-то еще платформе int может быть 2, long может быть 4, а long long 8. Это зависит от платформы. Если вам нужен конкретный размер, обратите внимание на std::int32_t и std::int64_t.   -  person Eljay    schedule 20.06.2021
comment
@Eljay: У вас есть система, в которой long равно 16, а long long равно 32?!? Что это за платформа? Я практически никогда не видел системы, в которой long long — это что угодно, кроме 8, long — единственная, которая сильно различается (в некоторых системах 4, в других — 8). (Небольшое примечание: вопрос касается C, поэтому префикс std:: отсутствует)   -  person ShadowRanger    schedule 20.06.2021
comment
IIRC, в наши дни long составляет 4 байта в Windows и 8 в других местах. Если неясно, Элджей не говорит о реальных платформах, а просто подчеркивает.   -  person HolyBlackCat    schedule 20.06.2021
comment
В любом случае, в Википедии есть статья о различных стандартах размеров типов данных на 64 битовые машины, если все, что вы ищете, это то, что будет, какого размера и где.   -  person ShadowRanger    schedule 20.06.2021
comment
@HolyBlackCat: я должен так предположить, но они не сформулировали это таким образом, поэтому мне было любопытно, существует ли такая система в реальной жизни (я работал с некоторыми странными системами, где буквально каждый тип был восьмибайтным, включая char, так что я не собирался это исключать).   -  person ShadowRanger    schedule 20.06.2021
comment
@ShadowRanger • это еще не настоящая система, это экспериментальная система моей работы в гараже. Может и не уйти никуда. (Ранее этот вопрос был помечен c++.)   -  person Eljay    schedule 20.06.2021
comment
Если бы эти размеры были фиксированными, вам не понадобился бы оператор sizeof.   -  person wildplasser    schedule 20.06.2021
comment
Спасибо за все ответы, теперь понял :)   -  person dinindu    schedule 21.06.2021


Ответы (1)


Стандарт C не требует, чтобы long long было 16 байт или было шире, чем long.

В C 2018 5.2.4.2.1 1 стандарт требует, чтобы long long мог представлять числа от -(263-1) до +(263-1) . Для этого требуется не менее 64 бит, поэтому long long должно быть не менее 8 8-битных байтов (или, например, 4 16-битных байта). Для реализации C необязательно делать long long шире и поддерживать больший диапазон.

В 6.3.1.1 1 стандарт требует, чтобы ранг long long (также известный как long long int) был выше ранга long. Из-за определения «ранга» это означает, что long long должен иметь как минимум такую ​​же точность, как long. (Точность целочисленного типа — это количество битов, используемых для представления значения, не включая бит знака.) Стандарт не требует, чтобы long long имел большую точность, чем long; может быть равным.

person Eric Postpischil    schedule 20.06.2021