Основная причина, как я понимаю, в том, какое двоичное представление следует использовать? свое дополнение? два дополнения? Вы ожидаете фактические биты в памяти или представление абстрактного числа?
Только последний имеет смысл, когда C не предъявляет требований к размеру слова или представлению двоичных чисел. Так что, поскольку в памяти не будет битов, вы наверняка предпочтете прочитать абстрактное число в шестнадцатеричном виде?
Утверждение, что абстрактное представление является «двоичным», может привести к убеждению, что -0b1 ^ 0b1 == 0
может быть истинным или что -0b1 | -0b10 == -0b11
Возможные представления:
Хотя существует только одно значимое шестнадцатеричное представление - абстрактное, число -0x79
может быть представлено в двоичном виде как:
-1111001
(номер аннотации)
11111001
(дополнение)
10000111
(дополнение к двум)
@ Эрик убедил меня в этом порядке байтов! = Порядок слева направо ...
проблема усугубляется, когда числа не помещаются в один байт. тот же номер может быть:
-
1000000001111001
как 16-битное число с прямым порядком байтов, дополняющее один ряд
-
1111111110000111
как двоичное 16-битное двоичное число с дополнительным порядком байтов
-
1000011110000000
как однозначное 16-битное число с прямым порядком байтов
-
1000011111111111
как 16-битное число с прямым порядком байтов, дополняемое двумя числами
Понятия порядкового номера и двоичного представления не применяются к шестнадцатеричным числам, поскольку их никак нельзя считать фактическим представлением битов в памяти.
Все эти примеры предполагают 8-битный байт, который C не дает никаких гарантий (действительно, были исторические машины с 10-битными байтами)
Почему ни одно решение не лучше, чем любое решение:
Очевидно, что можно произвольно выбрать одно представление или оставить его реализацию определенной.
Однако:
- если вы пытаетесь использовать это для отладки побитовых операций (что я вижу в качестве единственной убедительной причины использовать двоичные над шестнадцатеричными), вы хотите использовать что-то близкое к тому, что использует аппаратное обеспечение, что делает невозможным стандартизацию, поэтому вы хочу, чтобы реализация была определена.
- И наоборот, если вы пытаетесь прочитать битовую последовательность, вам нужен стандартный, а не определенный реализацией формат.
- И вы определенно хотите, чтобы printf и scanf использовали одно и то же.
Так что мне кажется, что счастливой среды не существует.