На языке Си, как числа представляются внутри - PullRequest
1 голос
/ 30 марта 2012

Я новичок в C, и у меня есть такое утверждение:

printf("%d",(1^6));

, который выдает ответ как 7. Я знаю, ^ является оператором XOR. Я предполагаю, что здесь , 1 представлено в 4 бита , как 0001 и 6, как 0110. Выполнение xor приводит к результату 0111, равному 7.

Это мое предположение верно? На языке C, как числа представляются внутри?

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 30 марта 2012

Здесь нужно рассмотреть несколько разные вещи.

Стандарт языка C говорит, что литералы 1 и 6 имеют тип int, и поэтому операция XOR будет выполняться с использованием типа int.

Стандарт языка C также гласит, что тип int имеет двоичное представление, причем биты значений выполняются от наименьшего до наиболее значительного при увеличении степеней 2, плюс знаковый бит, который здесь не имеет значения, поскольку числа оба положительный плюс дополнительно некоторые биты заполнения (и я никогда не использовал реализацию C, у которой были какие-либо биты заполнения в int).

Таким образом, в этих терминах вы правы: 1 представлен в двоичном виде 1, 6 представлен в двоичном виде 110, 7 равен 111, плюс есть начальные 0, достаточные для составляют размер типа int. При записи двоичного числа мы редко пишем 00000000000000000000000000000001, даже если знаем, что его тип 32-разрядный.

Число битов значения + знака в int составляет 32 в большинстве реализаций. Вы можете иногда видеть 64 или даже 16. Стандарт требует по крайней мере 16, но в прошлом он допускает любое число.

int обычно занимает более одного байта памяти. Стандарт не указывает, занимают ли младшие значащие биты первый (самый младший) байт, или последний (самый высокий адрес), или где-то посередине. Таким образом, он допускает как представления с прямым порядком байтов, так и представления с прямым порядком байтов, а в теории также представления со «средним порядком байтов» (я никогда не видел ни одного из них, по крайней мере, не для int). Endian-ness относится к представлению int в памяти, но это не имеет отношения к побитовым операциям (включая XOR), которые определяются в битах в порядке значимости, а не в порядке их следования в памяти.

Это все в стандарте, но стандарт также говорит, что он описывает только поведение "абстрактной машины". То, что ваш компилятор на самом деле делает , должно иметь тот же результат, что и в стандарте, но для любого данного фрагмента кода не требуется, чтобы вы точно видели эти представления в памяти при запуске программы. Для компилятора было бы совершенно законно выдавать тот же код для вашей строки, что и для printf("7"); или даже fputc('7', stdout);, если он этого хочет. Поэтому в выдаваемом коде может отсутствовать представление 1.

Возможно, он оптимизирует только до printf("%d", 7);, если printf реализован как часть библиотеки, и компилятор не беспокоится о том, что "%d" означает для этой библиотеки. Возможно, он выполнит вычисления во время выполнения, но будет представлять 1, однако считает, что он наиболее компактен и / или эффективен для целевого ЦП, если компилятор впервые доказал, что другой размер даст тот же результат , Например, некоторые наборы команд допускают так называемые «непосредственные значения», которые представляют собой небольшие целые числа, которые хранятся как часть инструкции. Представление 1 все равно будет некоторым числом 0 с 1 в конце, но поскольку непосредственные операторы должны помещаться внутри инструкции, они обычно будут меньше int.

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

3 голосов
/ 30 марта 2012

Числа (точнее - значения ) представляют собой способ сборки компьютера.Если компьютер построен с использованием 4-битных слов - то, как вы описали.Современные компьютеры используют 32 или 64 бита на слово, и есть представления с прямым и старшим порядком байтов.

Кроме того, представление дробей сильно различается и существует несколько различных стандартов.между различными языками программирования (хотя большинство использует сходные соглашения и стандарты).

В конечном итоге все сводится к битам и байтам.

1 голос
/ 30 марта 2012

Количество битов, представляемых целым числом, зависит от вашей архитектуры - например, 32 или 64 бита.

Число 1 - это целое число, поэтому в 32-битной архитектуре оно представлено 4 байтами, или32 бита.

0 голосов
/ 30 марта 2012

Поскольку C не является интерпретируемым языком, не существует «внутреннего представления» целых чисел (или чисел или символов с плавающей запятой). В стандарте языка C существуют правила, которые ограничивают или определяют, сколько битов должны иметь различные типы и минимальное количество битов по сравнению с другими типами в языке.

В конце концов, ваша архитектура влияет на количество бит, которое будет иметь целое число во время выполнения. В этом конкретном случае этого вполне может хватить с 8 битами, но вам необходимо проверить сгенерированный машинный код / ​​ассемблер, чтобы быть уверенным.

...