Программирование на C - Размер 2U и 1024U - PullRequest
0 голосов
/ 22 марта 2019

Я знаю, что литерал U означает в c, что значение является целым числом без знака. Размер беззнакового заполнителя составляет 4 байта.

Но насколько велики 2U или 1024U? Означает ли это, например, что 2 * 4 байта = 8 байтов или эта запись означает, что 2 (или 1024) являются целыми числами без знака?

Моя цель - выяснить, сколько памяти будет выделено, если я вызову malloc следующим образом

int *allocated_mem = malloc(2U * 1024U);

и докажи в короткой программе мой ответ, что я попробовал вот так

printf("Size of 2U: %ld\n", sizeof(2U));
printf("Size of 1024U: %ld\n", sizeof(1024U));

Я бы рассчитал для первой строки размер 2 * 4 байта = 8, а для второй, например, 1024 * 4 байта = 4096, но на выходе всегда будет "4".

Действительно оценит, что именно означают 2U и 1024U, и как я могу проверить их размер в C?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Моей целью было бы выяснить, сколько памяти будет выделено, если я вызову malloc следующим образом int *allocated_mem = malloc(2U * 1024U);

Что сложного в 2 * 1024 == 2048?Тот факт, что они являются беззнаковыми литералами, не меняет их значения.


Размер беззнакового взломщика составляет 4 байта. (sic)

Вы правы.Так что 2U занимает 4 байта, а 1024U занимает 4 байта, потому что они оба являются целыми числами без знака.


Я бы рассчитал на первую строку размером2 * 4 байта = 8, а для второго типа 1024 * 4 байта = 4096, но на выходе всегда "4".

Почему значение может изменить размер?Размер зависит только от типа.2U имеет тип unsigned int, поэтому занимает 4 байта;такой же как 50U, такой же как 1024U.Все они занимают 4 байта .

Вы пытаетесь умножить значение (2), умноженное на размер шрифта.Это не имеет смысла.

0 голосов
/ 22 марта 2019

Насколько велики?

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));
...