Почему константа C не может быть сохранена в коротком типе - PullRequest
0 голосов
/ 08 мая 2011

Как видно из названия, я не понимаю, почему это так.

Код:

#include <stdio.h>
#define try 32


int main(void)
{

    printf("%ld\n" , sizeof try);

    return 0;

}

Вопрос:

1.) Когда я пытаюсь использовать оператор sizeof для получения размера хранилища, в котором хранится константа try, я получаю 4, которое является 32-битным.

2.) Почему C не хранит его в 16-битовом short, поскольку он достаточно велик, чтобы вместить его.

3.) Есть ли способы сохранить константу в типе short?

Спасибо, что прочитали мой вопрос, очень признателен.

Ответы [ 4 ]

3 голосов
/ 08 мая 2011

Вы неправильно поняли препроцессор Си.Препроцессор C просто выполняет подстановку строк - он не знает типов.'32' будет интерпретироваться в соответствии с языковыми правилами, применяемыми к контексту, в который он вставлен - как правило, как int.

Чтобы сделать ваше определенное значение всегда коротким, вы можете сделать:

#define try ((short)32)

См. Также: Как написать короткий литерал на C ++?

2 голосов
/ 08 мая 2011

Объявленные константы - это, вероятно, то, что вы ищете:

const short try = 32;

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

1 голос
/ 08 мая 2011

То, что вы называете определением константы, на самом деле является макроопределением, в котором говорится, что попытка метки будет заменена на 32 во время предварительной обработки.

Таким образом, компилятор поймет это sizeof (32), который не имеет никакоготип указан.Таким образом, он получает типы по умолчанию, которые зависят от системы.

Чтобы сделать короткую константу, вам придется либо привести свое значение в определенный макрос, либо инициализировать его как глобальное, например:

const short try = 32;
0 голосов
/ 08 мая 2011

Я воспользуюсь этим, но я не совсем уверен, прав ли я

Поскольку #define просто говорит препроцессору заменить try на ваш номер, он действует так, как если бы он был просто значением. На вашем конкретном компьютере это значение хранится в 4-байтовом пространстве в памяти. Единственное решение, которое я могу придумать, - это использовать машину с архитектурой, которая использует 16-битный размер по умолчанию для int.

Даже если он был коротким, он все равно может занимать 4 байта в памяти из-за выравнивания, но это действительно зависит.

...