Здесь нужно рассмотреть несколько разные вещи.
Стандарт языка 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
.
Точные подробности такого рода вещей зависят от вашего компилятора, целевой архитектуры, уровня оптимизации и, возможно, других параметров компилятора.