целое число в с зависит от чего? - PullRequest
11 голосов
/ 10 марта 2011

Размер целого зависит от чего?

Зависит ли размер переменной int в C от машины или компилятора?

Ответы [ 8 ]

11 голосов
/ 10 марта 2011

Это зависит от реализации.Стандарт C требует только, чтобы:

  • char имел по крайней мере 8 бит
  • short имел по крайней мере 16 бит
  • int имел по крайней мере16 бит
  • long имеет не менее 32 бит
  • long long имеет не менее 64 бит (добавлено в 1999 г.)
  • sizeof (char) ≤ sizeof (short)≤ sizeof (int) ≤ sizeof (long) ≤ sizeof (long long)

В 16/32-битных днях стандарт de facto был:

  • int был "собственным" целочисленным размером
  • , другие типы имели минимально допустимый размер

Однако 64-битные системы обычно не не make int 64 бита, что создало бы неловкую ситуацию с тремя 64-битными типами и без 32-битного типа. Некоторые компиляторы расширены long до 64 бит.

7 голосов
/ 10 марта 2011

Формально представления всех основных типов данных (включая их размеры) зависят от компилятора и зависят только от компилятора.Компилятор (или, точнее, реализация ) может служить уровнем абстракции между программой и машиной, полностью скрывая машину от программы или искажая ее любым удобным для нее способом.

Но на практике компиляторы предназначены для генерации наиболее эффективного кода для данной машины и / или ОС.Для достижения этого базовые типы данных должны иметь естественное представление для данной машины и / или ОС.В этом смысле эти представления косвенно зависят от машины и / или ОС.

Другими словами, с абстрактной, формальной и педантичной точек зрения компилятор может полностью игнорировать представления типов данных, характерные длямашина.Но это не имеет никакого практического смысла.На практике компиляторы полностью используют представления типов данных, предоставляемые машиной.

Тем не менее, если какой-либо тип данных не поддерживается машиной, компилятор все еще может предоставлять этот тип данных программам, реализуя свою поддержку науровень компилятора («эмулирующий» его).Например, 64-разрядные целочисленные типы обычно доступны в 32-разрядных компиляторах для 32-разрядных компьютеров, даже если они не поддерживаются машиной напрямую.В свое время компиляторы часто обеспечивали поддержку на уровне компилятора для типов с плавающей запятой для машин, которые не были оснащены сопроцессором с плавающей запятой (и поэтому не поддерживали типы с плавающей запятой напрямую).

7 голосов
/ 10 марта 2011

Это зависит в первую очередь от компилятора.Например, если у вас 64-разрядный процессор x86, вы можете использовать старый 16-разрядный компилятор и получить 16-разрядные целочисленные значения, 32-разрядный компилятор и получить 32-разрядные целые числа, или 64-разрядный компилятор и получить 64-bit ints.

Это зависит от процессора в той степени, в которой компилятор нацелен на конкретный процессор, и (например) древний 16-битный процессор просто не будет запускать код, нацеленный на новый блестящий 64-битовый процессор.

Стандарты C и C ++ действительно гарантируют некоторый минимальный размер (косвенно путем указания минимальных поддерживаемых диапазонов):

char: 8 bits
short: 16 bits
long: 32 bits
long long: 64 bits

Также гарантируется, что размеры / диапазоны строго не уменьшаютсяв следующем порядке: char, short, int, long и long long 1 .

1 long указывается в C99 и C ++ 0x, нонекоторые компиляторы (например, gcc, Intel, Comeau) также допускают это в коде C ++ 03.Если вы хотите, вы можете убедить большинство (если не все) отклонить long long в коде C ++ 03.

2 голосов
/ 10 марта 2011

AFAIK, размер типов данных зависит от реализации .Это означает, что исполнитель (то есть тот, кто пишет компилятор), должен сам выбирать, кем он будет.Но зачастую проще просто использовать любой размер, который проще всего сопоставить с размером слова базовой машины - поэтому компилятор часто использует размер, который лучше всего подходит для базовой машины.

2 голосов
/ 10 марта 2011

Как сказал MAK, это зависит от реализации. Это означает, что это зависит от компилятора. Обычно компилятор нацелен на одну машину, поэтому вы также можете думать о ней как о машинно-зависимой.

0 голосов
/ 10 декабря 2011

Размер целочисленной переменной зависит от типа компилятора:

  • если у вас есть 16-битный компилятор:

    size of int is 2 bytes
    char holds 1 byte
    float occupies 4 bytes
    
  • если у вас 32-битный компилятор:

    размер каждой переменной в 16-битном компиляторе просто вдвое больше ее размера

    int hold 4 bytes
    char holds 2 bytes
    float holds 8 bytes 
    

То же самое происходит, если у вас есть 64-битный компилятор и так далее.

0 голосов
/ 10 марта 2011

Это зависит от рабочей среды, независимо от того, какое у вас оборудование. Если вы используете 16-битную ОС, такую ​​как DOS, то это будет 2 байта. В 32-битных ОС, таких как Windows или Unix, это 4 байта и так далее. Даже если вы используете 32-битную ОС на 64-битном процессоре, размер будет только 4 байта. Надеюсь, это поможет.

0 голосов
/ 10 марта 2011

Это зависит как от архитектуры (машина, тип исполняемого файла), так и от компилятора.C и C ++ гарантируют только определенные минимумы.(Я думаю, что это char: 8 бит, int: 16 бит, long: 32 бита)

C99 включает в себя определенные известные типы ширины, такие как uint32_t (когда это возможно).См. stdint.h

Обновление : устранены проблемы Конрада Мейера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...