Мне сказали, что типы C зависят от машины. Сегодня я хотел это проверить.
void legacyTypes()
{
/* character types */
char k_char = 'a';
//Signedness --> signed & unsigned
signed char k_char_s = 'a';
unsigned char k_char_u = 'a';
/* integer types */
int k_int = 1; /* Same as "signed int" */
//Signedness --> signed & unsigned
signed int k_int_s = -2;
unsigned int k_int_u = 3;
//Size --> short, _____, long, long long
short int k_s_int = 4;
long int k_l_int = 5;
long long int k_ll_int = 6;
/* real number types */
float k_float = 7;
double k_double = 8;
}
Я скомпилировал его на 32-битной машине с использованием компилятора minGW C
_legacyTypes:
pushl %ebp
movl %esp, %ebp
subl $48, %esp
movb $97, -1(%ebp) # char
movb $97, -2(%ebp) # signed char
movb $97, -3(%ebp) # unsigned char
movl $1, -8(%ebp) # int
movl $-2, -12(%ebp)# signed int
movl $3, -16(%ebp) # unsigned int
movw $4, -18(%ebp) # short int
movl $5, -24(%ebp) # long int
movl $6, -32(%ebp) # long long int
movl $0, -28(%ebp)
movl $0x40e00000, %eax
movl %eax, -36(%ebp)
fldl LC2
fstpl -48(%ebp)
leave
ret
Я скомпилировал тот же код на 64-битном процессоре (Intel Core 2 Duo) на GCC (linux)
legacyTypes:
.LFB2:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movb $97, -1(%rbp) # char
movb $97, -2(%rbp) # signed char
movb $97, -3(%rbp) # unsigned char
movl $1, -12(%rbp) # int
movl $-2, -16(%rbp)# signed int
movl $3, -20(%rbp) # unsigned int
movw $4, -6(%rbp) # short int
movq $5, -32(%rbp) # long int
movq $6, -40(%rbp) # long long int
movl $0x40e00000, %eax
movl %eax, -24(%rbp)
movabsq $4620693217682128896, %rax
movq %rax, -48(%rbp)
leave
ret
Наблюдения
char, знаковый символ, неподписанный символ, int, unsigned int, подписанный int, short int, unsigned short int, подписанный short int все занимают одно и то же значение no. байтов на 32-битном и 64-битном процессорах.
Единственное изменение в long int
& long long int
, оба из которых занимают 32-разрядную на 32-разрядной машине и 64-разрядную на 64-разрядной.
А также указатели, которые занимают 32-разрядные на 32-разрядных ЦП и 64-разрядные на 64-разрядных ЦП.
Вопросы:
- Я не могу сказать, что книги говорят неправильно. Но я что-то здесь упускаю. Что именно означает «Типы переменных являются машинно-зависимыми?»
- Как видите, нет разницы между инструкциями для неподписанных и подписанных номеров. Тогда почему диапазон номеров, к которым можно обратиться, используя оба, отличается?
- Я читал Как сохранить фиксированный размер переменных типов C на разных машинах? Я не понял цели вопроса или его ответов. Какое сохранение фиксированного размера? Они все одинаковы. Я не понимаю, как эти ответы обеспечат одинаковый размер.
EDIT:
Разве нельзя обеспечить одинаковый размер для разных машин? Я имею в виду, как можно поддерживать одинаковый размер указателя как на 64-битной, так и на 32-битной машине?