Я полагаю, что для системы было бы почти, но не совсем возможно иметь тип char с одним дополнением, но есть четыре проблемы, которые не все могут быть решены:
- Каждый тип данныхдолжен быть представлен в виде последовательности символов, такой, что если все значения символов, составляющие два объекта, сравниваются одинаково, объекты данных, о которых идет речь, будут идентичны.
- Каждый тип данных также должен быть представлен в виде последовательности «unsigned char».
- Значения без знака, в которые можно разбить любой тип данных, должны образовывать группу, порядок которой равен степени двух.
- Я не верю, что стандарт разрешает машине, дополняющей себя, в особом случае значение, которое будет отрицательным нулем, и заставит его вести себя как-то иначе.
Может быть возможно иметь совместимый со стандартами компьютер с типом char, равным единице или дополнению со знаком, если единственным способом получить отрицательный ноль было бы наложение некоторого другого типа данных, и еслиотрицательный ноль по сравнению с положительным нулем.Я не уверен, может ли это соответствовать стандартам или нет.
РЕДАКТИРОВАТЬ
Кстати, если требование № 2 будет смягчено, мне интересно, какие именно требования будутбыть при наложении других типов данных на 'char'?Помимо всего прочего, хотя стандарт и делает совершенно ясным, что нужно иметь возможность выполнять присваивания и сравнения для любых значений 'char', которые могут возникнуть в результате наложения другой переменной на 'char', я не знаю, что это предъявляет какие-либо требованиячто все такие значения должны вести себя как арифметическая группа.Например, мне интересно, какова была бы законность машины, в которой каждая ячейка памяти физически хранилась как 66 битов, причем верхние два бита указывают, было ли значение 64-разрядным целым числом, 32-разрядным дескриптором памяти плюс 32смещение или 64-битное число с плавающей запятой двойной точности?Поскольку стандарт позволяет реализациям делать все, что им нравится, когда арифметическое вычисление превышает диапазон подписанного типа, это предполагает, что подписанные типы не обязательно должны вести себя как группа.
Для большинства типов со знаком существуетнет требования, чтобы тип не мог представлять какие-либо числа за пределами диапазона, указанного в limit.h;Если limit.h указывает, что минимальное значение «int» равно -32767, то для реализации было бы вполне законно разрешить значение -32768, так как любая программа, которая пыталась это сделать, вызывала Undefined Behavior.Ключевой вопрос, вероятно, заключался бы в том, будет ли допустимым, чтобы значение 'char', полученное в результате наложения какого-либо другого типа, давало значение вне диапазона, указанного в limit.h.Интересно, что говорит стандарт?