Размер int на 8-битных машинах

В стандарте ISO C указано, что A "plain" int object has the natural size suggested by the architecture of the execution environment

Однако также гарантируется, что int не меньше размера short, т. е. не менее 16 бит.

Естественный размер, предлагаемый 8-битным процессором, таким как 6502 или 8080, выглядит как 8-битный int, однако это делает int короче 16 бит. Итак, насколько большим будет int на одном из этих 8-битных процессоров?


person Orion    schedule 17.11.2016    source источник
comment
C и C++ гарантируют, что sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long), поэтому int никогда не может быть меньше short, даже если естественный размер был бы другим. C++ гарантирует, что short составляет не менее 16 бит. Не уверен, что C дает такую ​​же гарантию.   -  person Remy Lebeau    schedule 17.11.2016
comment
Раздел 5.2.4.2.1 N1548: SHRT_MAX и INT_MAX должны быть не менее 32767   -  person Danh    schedule 17.11.2016


Ответы (2)


Из Раздел 6.2.5 Типы, стр. 5

5 Объект, объявленный как подписанный тип char, занимает тот же объем памяти, что и «обычный» объект char. «Обычный» объект int имеет естественный размер, предложенный архитектурой среды выполнения (достаточно большой, чтобы содержать любое значение в диапазоне от INT_MIN до INT_MAX, как определено в заголовке <limits.h>).

И 5.2.4.2.1 Размеры целочисленных типов ‹пределы. ч› п1

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

...

  • минимальное значение для объекта типа int

    INT_MIN -32767 // -(215 - 1)

  • максимальное значение для объекта типа int

    INT_MAX +32767 // 215 - 1

Тогда на этих платформах int должно быть не менее 16 бит.

person Danh    schedule 17.11.2016
comment
Однако на практике некоторые могут использовать 8-битный int: для этого у avr-gcc есть переключатель -mint8. - person StaceyGirl; 14.11.2017

6502 имел только указатель инструкций в виде 16-битного регистра, 16-битные целые числа обрабатывались 8-битными с несколькими операторами, например. если сделать в 16 бит c = a + b

clc                 ; clear carry bit
lda A_lo            ; lower byte of A into accumulator
adc B_lo            ; add lower byte of B to accumulator, put carry to carry bit
sta C_lo            ; store the result to lower byte of C
lda A_hi            ; higher byte of A into accumulator
adc B_hi            ; add higher byte of B using carry bit
sta C_hi            ; store the result to higher byte of C

Процессоры 8080 и Z80 в то время также имели 16-битные регистры.

Процессор Z80 по-прежнему имел 8-битную архитектуру. Его 16-битные регистры в конечном итоге объединяли два 8-битных регистра, например BC, DE. Операции с ними были намного медленнее, чем с 8-битными регистрами, потому что архитектура процессора была 8-битной, но таким образом обеспечивались 16-битные регистры и 16 операций.

Архитектура 8088 была смешанной, потому что у нее тоже была 8-битная шина данных, но у нее были 16-битные регистры, AX, BX и т. д., младшие и старшие байты, также отдельно используемые как 8-битные регистры, AL, AH и т. д.

Таким образом, были разные решения для использования 16-битных целых чисел, но 8-битное целое число просто бесполезно. Вот почему C и C++ также использовали 16 бит для int.

person quantummind    schedule 17.11.2016
comment
Раньше я работал с компилятором Introl-C на 6809 (8-битной) архитектуре, и sizeof(int) было 16-битным. 6809 также имел внутренние 16-битные регистры. - person Joël Hecht; 17.11.2016
comment
У 6502 определенно не было 16-битных регистров. У вас был 8-битный A, 8-битный X и 8-битный Y. Даже указатель стека был 8-битным. Можно было бы возразить, что указатель инструкции был 16-битным, но он был недоступен, а указатель инструкции - person Orion; 17.11.2016