Почему 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
.