Насколько велики?
2U
и 1024U
имеют одинаковый размер, размер unsigned
, обычно 32-битный или 4 "байта".Размер типа одинаков для всей платформы - он не изменяется из-за значения .
«Я знаю, что литерал U означает в c, что значение является целым числом без знака».-> Хорошо, пока достаточно близко.
"Размер целых чисел без знака равен 4 байта."Разумная догадка пока что C требует, чтобы unsigned
были как минимум 16-битными.Кроме того, U
делает константу без знака , но это может быть unsigned
, unsigned long
, unsigned long long
, в зависимости от значения и платформы.
Подробно: в C 2U
- это не литерал , а константа .C имеет строковые литералы и составные литералы .Для литералов может быть взят адрес, но &2U
недопустим. C. В других языках вызывается 2U
a литерал , и у них есть правила использования.
Моя цель - выяснить, сколько памяти будет выделено, если я вызову malloc следующим образом int *allocated_mem = malloc(2U * 1024U);
Вместо этого лучше использовать size_t
для определения размера, чем unsigned
и проверить
size_t sz = 2U * 1024U;
int *allocated_mem = malloc(sz);
if (allocated_mem == NULL) allocated_mem = 0;
printf("Allocation size %zu\n", allocated_mem);
(в сторону). Будьте осторожны с вычисленными размерами.Сделайте свой размер математики, используя size_t
типов.4U * 1024U * 1024U * 1024U
может переполнить unsigned
математика, но может вычисляться по желанию с помощью size_t
.
size_t sz = (size_t)4 * 1024 * 1024 * 1024;
Следующие попытки вывести размер констант, которыйскорее всего 32-битные или 4 "байта", а не их значения .
printf("Size of 1024U: %ld\n", sizeof(1024U));
printf("Size of 1024U: %ld\n", sizeof(2U));