Задать вопрос
@Azrail636

Почему длина long int 4 байта?

Добрый день, недавно начал изучать язык С, для этих целей нашёл в интернете книгу Майка Макграта "C программирование для начинающих", там был приведён следующий код:
#include <stdio.h>
#include <limits.h>

void main()
{
        printf("short int... \tsize: %d bytes \t", sizeof(short int));
        printf("от %d до %d \n", SHRT_MAX, SHRT_MIN);

        printf("long int... \tsize: %d bytes \t", sizeof(long int));
        printf("от %ld до %ld \n", LONG_MAX, LONG_MIN);
}

В консоли автора был показан такой вывод:
68540c779b6c9974146271.png
У меня получился другой вывод:
68540cfd2f659538828195.png
Интернет говорит что длина long int 8 байт, а длина int 4 байта. Но тогда почему у автора длина long int 4 байта?
  • Вопрос задан
  • 251 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
Vamp
@Vamp
Размер этого типа данных не специфицирован. У автора на 32-битном процессоре он оказался 4 байта. У вас же 64-битный процессор, поэтому показывает 8 байт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Это особенность конкретного ABI (двоичного интерфейса).

16-битные машины: 1/2/2/4/ (char/short/int/long/long long)
Win32/64, Linux32: 1/2/4/4/8
Linux64: 1/2/4/8/8

И догадываюсь, почему так — это оказался лучший способ пофиксить некоторые старые API Си: таймеры (эпоха Unix, 0=1 янв 1970 00:00) и файлы.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
В Си так же как и в плюсах размер целочисленных типов не фиксирован, есть только ограничения, что
sizeof(int) >= sizeof(short) >= sizeof(char) и т.п.

Если для большинства типов, все таки размеры более-менее устоявшиеся для широкоиспользуемых архитектур и компиляторов, то в случае с long int все сложнее и действительно зависит от ABI. Т.е. даже на одной платформе но на разных компиляторах размер может быть разным. Например, сравните размеры типов в микрософтовском компиляторе и в mingw64 под 64 битной виндой на одном и том же компе.
Кстати, не забудьте, что есть еще long long int.
Чтоб не зависеть от подобных вещей рекомендую использовать типы с фиксированной длиной int32/int64 и т.п., которые объявлены в stdint.h

Размеры типов с плавающей точкой float/double как раз стандартизованы, но не стандартами Си/С++, а стандартом IEEE754.
Размер указателей - зависит от архитектуры. На 32 битных процессорах обычно это 4 байта, на 64 битных процессорах - 8.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы