Почему sizeof(int) == sizeof (long)?

в приведенной ниже программе sizeof(int) и sizeof (long) равны на моей машине (оба равны 4 байтам (или 32 битам)). Длинный, насколько я знаю, составляет 8 байт. Правильно ли это? У меня 64-битная машина

#include <stdio.h>
#include <limits.h>

int main(void){
    printf("sizeof(short) = %dn", (int)sizeof(short));
    printf("sizeof(int) = %dn", (int)sizeof(int));
    printf("sizeof(long) = %dn", (int)sizeof(long));
    printf("sizeof(float) = %dn", (int)sizeof(float));
    printf("sizeof(double) = %dn", (int)sizeof(double));
    printf("sizeof(long double) = %dn", (int)sizeof(long double));
    return 0;
}

4 ответов


длинный, насколько я знаю, составляет 8 байт. Правильно ли это?

нет, это неправильно. Спецификации C и c++ только утверждают, что long должен быть больше или равен 32 битам. int может быть меньше, но на многих платформах, в C и C++, long и int оба 32 бит.

Это очень хорошая причина, чтобы предпочитаю целочисленные типы фиксированной ширины например int64_t если они доступны для вас и вы используете стандарте C99 или framework, который предоставляет вам эквивалентный тип.


C не является Java или c#. Как писали другие, c spec утверждает минимальные длины и относительные длины. Почему? C был разработан, чтобы быть низкоуровневым и компилироваться и работать практически на любом оборудовании, когда-либо сделанном.

Если спецификация обещает программисту слишком много, ее реализация может стать сложной (и медленной), когда оборудование не поддерживает такую вещь. Разработчики Java и C# не слишком заботятся, им нравится удобство их языков для заданий более высокого уровня и не стесняйтесь устанавливать большие виртуальные машины, которые заботятся о выполнении всех обещаний (или, по крайней мере, большинства из них).

C программисты хотят иметь контроль над кодом даже на уровне машинного обучения. Полный контроль над оборудованием. Только таким образом можно использовать все аппаратные функции и достичь максимальной производительности. Но вы должны быть осторожны с вашими предположениями об оборудовании, которое вы используете. Как всегда, с большой силой приходит большая ответственность.

просто чтобы проиллюстрировать это: C не принимает 8-разрядные байты. См.CHAR_BIT на <limits.h>.

еще один вопрос размер целого числа в C.


это зависит от вашего ABI. Если вы используете Windows, Microsoft выбрала модель LLP64, поэтому long и int являются 32-битными, в то время как long long и указатели являются 64-битными в 64-битных сборках по устаревшим причинам.

большинство платформ UNIX выбрали модель LP64, что делает int 32-бит, long, long long, и указатели 64-разрядные, для 64-разрядных сборок.

но, как отмечает Рид Копси, в стандарте указаны только минимальные длины и относительные длины. И long должно быть больше чем или равна длине int.


нет, стандарт определяет минимумы, которые для long и 4 bytes и int is 2 bytes. Согласно проект стандарта C99 раздел 5.2.4.2.1 размеры целых типов абзац 1 говорит:

[...]Их значения, определенные для осуществления, должны быть равными или большими по величине[...]

и long у нас есть:

 LONG_MIN -2147483647 // -(2^31 - 1)
 LONG_MAX +2147483647 // 2^31 - 1     

что это 4 bytes. Ради полноты у нас есть следующие int:

 INT_MIN -32767 // -(2^15 - 1)
 INT_MAX +32767 // 2^15 - 1

что это 2 bytes.