Почему размер типа данных отличается, когда значение напрямую передается оператору sizeof?

15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

Выход:

8 4 4 4 4 1

Почему выходные данные отличаются для одинаковых значений?

JS
источник
12
6.5это не поплавок, этоdouble
NathanOliver
printf("%d",sizeof(6.5f));чтобы сделать это float.
Джонни Мопп
2
"почему вывод здесь другой?" почему так должно быть? Тот факт, что вы можете назначить один другому, не означает, что они имеют точно такой же тип.
Слава
5
Спецификатор формата должен быть, например,printf("%zu", sizeof(6.5));
Weather Vane

Ответы:

9

Символьные константы в C (противоположные C ++) имеют тип int. Итак, этот вызов

printf("%d",sizeof('A'));

Выходы 4. То sizeof( 'A' )есть равно sizeof( int ).

Из стандарта C (6.4.4.4 Символьные константы)

10 Целочисленная символьная константа имеет тип int ....

С другой стороны (6.5.3.4 Операторы sizeof и alignof)

4 Когда sizeof применяется к операнду с типом char, unsigned char или char со знаком (или его соответствующей версией), результатом будет 1.

Таким образом, операнд sizeofоператора в этом выражении sizeof( 'A' )имеет тип int, а в этом выраженииsizeof( a ) a объявлен как

char a = 'A';

операнд имеет тип char.

Обратите внимание, что звонки, как это

printf("%d",sizeof(6.5));

использовать неверный спецификатор формата преобразования. Вы должны написать

printf("%zu",sizeof(6.5));

Также в приведенном выше вызове используется константа типа, в doubleто время как в этом вызове

printf("%zu",sizeof(c));

переменная c имеет тип float.

Вы можете получить тот же результат для этих вызовов, если в первом вызове используется константа типа float, например

printf("%zu",sizeof(6.5f));
Влад из Москвы
источник
19

Константы, как и переменные, имеют свой собственный тип:

  • 6.5 : Константа с плавающей точкой типа double
  • 90000: Целочисленная константа типа int(если intэто 32 бита) или long(еслиint это 16 бит)
  • 'A' : Символьная константа типа intв C иchar C ++

Размеры, которые печатаются, являются размерами вышеуказанных типов.

Также результат sizeofоператора имеет тип size_t. Таким образом, при печати правильный спецификатор формата для использования %zu, а не %d.

dbush
источник
1

Потому что значения не имеют значения sizeof. Это размер типов.

  • символьные константы ints, а не chars.

  • Константы с плавающей точкой по умолчанию doubles, если вы не суффиксуете их с помощью fили l.

СС Энн
источник