короткие int литералы в C - PullRequest
2 голосов
/ 15 декабря 2009

Почему в C нет коротких литералов int?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2009

Не имеет смысла иметь короткий литерал int в C, поскольку все целочисленные выражения оцениваются так, как если бы подвыражения имели размер не менее int.

5 голосов
/ 15 декабря 2009

В качестве альтернативы: потому что они не нужны!

Типы данных различных размеров необходимы, чтобы хорошо соответствовать базовому оборудованию и / или экономить пространство памяти, но литералы представляют собой конструкцию времени компиляции, которая в любом случае сохраняется в соответствующих структурах данных.

Это отличается от float против double, потому что одно и то же число на самом деле имеет различное внутреннее представление в них - во всяком случае, более различное, чем просто несколько ведущих нулей.

Аналогично, есть разница между char и short, даже если они могут храниться в одних и тех же битах: если программист говорит о символьных данных, ему обычно будет удобнее указать, скажем, 'A' чем 65.

Но короткий 99 и int 99 выглядят одинаково для программиста, обрабатываются одинаково в программе ... более широкий тип легко выполнит работу обоих.

1 голос
/ 15 декабря 2009

Если мы говорим оригинальный языковой дизайн, помните, что C получил большую часть своей нынешней формы на процессоре PDP-11, который является 16-битным. Таким образом, у них были целые числа для арифметики и символы для хранения строк. Указатели в основном совпадали с целыми числами.

Язык был очень прагматичным и только позже получил более формальный и сложный синтаксис. Так что ответ таков. Намного позже мы получили 32-битные и 64-битные процессоры и необходимость различать целые числа различной длины.

До сегодняшнего дня я кодирую почти все свои программы на Си, как будто не было другого типа, кроме char и integer. О, кстати, "char" в C может быть как подписанным, так и неподписанным в соответствии со стандартом. Это отражает то, что символы были предназначены для хранения символов (строки) и целые числа для арифметики.

Чтобы уточнить, (спасибо, semaj), компилятор может выбрать обработку переменной, объявленной как "char", как "unsigned char". Это не происходит для "Int". «Int» всегда подписывается, но с символами вы не можете быть уверены. Вы должны предположить, что у символа может быть либо беззнаковая, либо подписанная арифметика. Это оптимизация скорости для размещения процессоров, которые работают быстрее с любой реализацией. То есть акцент делается на символы как контейнеры для хранения, а не как арифметический тип. (Это название также является поддавкой. Его можно было назвать «коротким» или «маленьким», но по какой-то причине называли «char»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...