2016-07-19 7 views
6

Можно ли предположить, что -LLONG_MAX (с отрицанием LLONG_MAX) относится к long long диапазон?Что такое Стандартные гарантии C++ по отношению между минимальными и максимальными значениями целочисленных типов со знаком?

Можно ли предположить, что если LLONG_MIN < -LLONG_MAX, то LLONG_MIN == -LLONG_MAX - 1?

Гарантировано ли стандартом или только всеми реальными устройствами, либо LLONG_MIN == -LLONG_MAX - 1, либо LLONG_MIN == -LLONG_MAX?

+0

Поделитесь своим исследованием. –

+1

@ code0 Какие исследования? OP хочет знать, соответствует ли его гипотеза стандартным требованиям. – NathanOliver

+0

@ code0 не удалось найти связь между MIN и MAX знаковых целых типов ни в стандартном черновике C++ 11, ни в стандартном черновике C11. Может, я что-то пропустил. –

ответ

3

Безопасно предположить, что -LLONG_MAX (отрицается LLONG_MAX) принадлежит long long диапазоне?

Можно ли предположить, что если LLONG_MIN < -LLONG_MAX, то LLONG_MIN == -LLONG_MAX - 1?

Гарантировано ли стандартом или только всеми реальными устройствами, либо LLONG_MIN == -LLONG_MAX - 1, либо LLONG_MIN == -LLONG_MAX?


Эти три утверждения справедливы и в случае реализации использует один из 2-х в дополнение, 1 дополнением, или знак и величину, чтобы представлять подписанные целочисленные типы. -LLONG_MAX находится в диапазоне long long во всех трех схемах, а LLONG_MIN - -LLONG_MAX (дополнение 1, знак и величина и, возможно, дополнение 2) или -LLONG_MAX-1 (возможно, дополнение 2). 2 могут использовать эту дополнительную ценность в качестве представления ловушки, так же как машины с дополнением, знаками и величинами могут использовать отрицательный ноль в качестве представления ловушки. Поэтому ответ на ваши вопросы «да», если стандарт предусматривает, что реализация использует одну из этих схем.

Стандарт C (к которому C++ стандарт откладывает во многих местах) мандаты либо дополнения до 2, 1 в комплемента, или знак и величину:

C11 6.2.6.2 типы Integer:

Если знаковый бит равен единице, значение должно быть изменено одним из следующих способов:

- соответствующее значение со знаком бит 0 отрицается (знак и величина);
- бит знака имеет значение - (2M) (дополнение двух);
- бит знака имеет значение - (2M - 1) (дополнение к одному).

стандарт C++, кажется, немного более открытым:

C++ 14 3,9.1 Фундаментальные типы:

Представления интегральных типов должны определять значения с использованием чистой двоичной системы нумерации . [Пример: настоящий международный стандарт допускает дополнение 2, дополнение к дополнению и знак соответствия для интегральных типов. - конец примера]

Сноска 51, которая определяет, что «чистая двоичную систему счисления» означает, по-видимому, исключают десятичные системы, а также смещение систем (где 0 не все биты ноля):

51) Позиционное представление для целых чисел, которое использует двоичные цифры 0 и 1, в которых значения, представленные последовательными битами, являются аддитивными, начинаются с 1 и умножаются на последовательную интегральную мощность 2, за исключением, бит с наивысшей позицией.

Практически говоря, все, что осталось, дополняют друг друга, дополняют друг друга, знака и величины: те же схемы, которые предусмотрены стандартом C. Я сомневаюсь, что продавец коснется машины, которая использует новую схему 21-го века для представления целых чисел и каким-то образом отвечает букве закона стандарта C++ (но, следовательно, несовместима с C).

+0

Я правильно понял? Практически это верно, но теоретически, если два значения с верхним битом 1 зарезервированы для специальных значений, таких как «не инициализировано» и «ошибка», тогда диапазон отрицательных чисел может быть меньше диапазона положительных чисел. –

+0

@FyodorMenshikov - Вы читаете это неправильно (или я написал это неправильно). С каждой из этих трех схем есть одно значение, которое не совсем подходит. С дополнением 1 и знаковой величиной отрицательный ноль. (Представление с плавающей запятой IEEE также имеет отрицательный ноль, но этот стандарт имеет конкретные правила о том, как обращаться с отрицательным нолем.) С дополнением 2 это дополнительное значение - '-LLONG_MAX-1'. Использование этого в качестве представления ловушки означает, что 'LLONG_MIN' является' -LLONG_MAX', как и в двух других схемах. –

+0

Может ли теоретически быть 4-я схема, которая отличается от одной из них только в одном дополнительном отрицательном значении? Возможно, зарезервировано не на уровне аппаратного обеспечения, а на уровне компилятора. –

0

№ Стандарт не предписывает целочисленное представление дополнений 2.

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

+1

Вопрос касается дополнения 2, дополнения 1 и знаковой величины. –

+0

OP специально задает один и тот же вопрос три раза: это совместимость с 2-мя компами безопасна и гарантирована? Ответ - нет_. –

+0

Прочтите последний элемент еще раз: 'LLONG_MIN == -LLONG_MAX' неверен на машинах дополнения 2. –