Я читаю книгу, рассказывающую о C, для меня лучше сначала представить код, а затем вопрос.
Первый код
#include <stdio.h>
int main(void)
{
short num = 3;
printf("%hd\n" , num );
return 0;
}
Второй код
#include <stdio.h>
int main(void)
{
short num = 3;
printf("%d\n" , num );
return 0;
}
Специальное примечание : Я использую ПК на базе Intel, поэтому размер int 32-битный.
Вопрос:
1.) В книге упоминается, что эти два кода могут работать правильно, хотя один из них использует спецификатор %hd
, а другой использует спецификатор %d
.
2.) Причина из книги в том, что механизм C будет автоматически преобразовывать тип short в int для более быстрого вычисления, поэтому с помощью спецификатора %d
или даже %ld
, который является 32-битным, также даст правильный результат.
3.) Мой вопрос: когда произошло это преобразование? Это происходит во время передачи его в качестве аргумента функции printf()
, точно так же, как переменная с плавающей запятой преобразуется в double, когда она передается как выражение или аргумент, или к тому времени, когда мы инициализируем переменную со значением 3
??
4.) На самом деле я провел небольшой эксперимент, то есть распечатал размер переменной num с помощью оператора sizeof
вместе с функцией printf()
, и он показывает мне 2 bytes
. Но я все еще не уверен, когда произойдет конверсия.
5.) Если преобразование произошло в то время, когда мы присвоили значение короткой переменной, какой смысл создавать короткую переменную ?? (** Этот вопрос следует игнорировать, если это не так )
Ваша помощь очень ценится