Встречался ли вам процессор, где sizeof(int) равен трём? Не древность какая, а вполне современный чип. На Маузере
$12 баксов стоит. Это тот самый eZ80, что в компьютере
Agon Light, что я упоминал. Он хоть и уродился от 16-битного z80, но размер всех регистров увеличили до 24 бит. Получился странный размер целого числа.
Zilog поставляет бесплатный компилятор Си, но только для Windows. К счастью, оно успешно ставится и работает на Линуксе посредством Wine. Скачивается по ссылке:
ZDS II eZ80Acclaim. После установки пакет оказывается в каталоге
~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim!_5.3.4.
Чтобы выяснить размер
int, скомпилируем тривиальную програмку и глянем ассемблерный результат:
$ cat szint.c
int szint()
{
return sizeof(int);
}
$ export WINEDEBUG=-winediag,-systray
$ wine ~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim\!_5.3.4/bin/ez80cc.exe -cpu:EZ80F92 -noasm szint.c
$ cat szint.src
; Zilog eZ80 ANSI C Compiler Release 3.4
; -nomodsect -peephole -globalopt -localcse -optsize
; -const=ROM
FILE ".\szint.c"
.assume ADL=1
SEGMENT CODE
; 1 int szint()
; 2 {
_szint:
; 3 return sizeof(int);
LD HL,3
; 4 }
RET
;**************************** _szint ***************************
;Name Addr/Register Size Type
; Stack Frame Size: 6 (bytes)
; Spill Code: 0 (instruction)
XDEF _szint
END
Видите команду
LD HL,3? Это возвращаемое значение
sizeof(int) = 3.
Глянем для интереса значения INT_MAX и INT_MIN:
$ grep -rh define\ INT_M ~/.wine/drive_c/ZiLOG/ZDSII_eZ80Acclaim\!_5.3.4/include
#define INT_MAX 8388607 /* max value for int */
#define INT_MIN (-8388607 - 1) /* min value for int */
Такой вот странный процессор.