Определение диапазона типа данных - PullRequest
1 голос
/ 03 июня 2009

Что подразумевается под "диапазоном" типа данных, такого как целое число?

Ответы [ 9 ]

7 голосов
/ 04 июня 2009

A тип данных - это абстракция, которая применяется к фрагменту памяти, чтобы увидеть этот фрагмент памяти как область, которая может представлять значение.

Например, один байт состоит из 8 бит памяти. На следующей диаграмме каждый бит представлен подчеркиванием (_):

byte: _ _ _ _ _ _ _ _  <- 8 bits

Поскольку у нас есть 8 позиций, в которые мы можем ввести либо 0, либо 1 (поскольку каждый бит памяти может быть установлен только в состояние on или off - следовательно, двоичный ), поэтому мы можем иметь 2^8 или 256 комбинаций различных значений, которые мы можем представить из 8 битов.

Это - то, где понятие диапазона входит в игру - как мы распределяем эти 256 комбинаций значений в пригодный для использования диапазон?

Один из способов - взять первую из 256 комбинаций как 0, а окончательную комбинацию - 255:

byte: 0 0 0 0 0 0 0 0  <- Represents a "0"
byte: 0 0 0 0 0 0 0 1  <- Represents a "1"

        .. so on ..

byte: 1 1 1 1 1 1 1 0  <- Represents a "254"
byte: 1 1 1 1 1 1 1 1  <- Represents a "255"

Для этого типа данных диапазон составляет от 0 до 255. Этот тип обычно называется unsigned byte, поскольку значения, которые он может представлять, равны unsigned, так как он не имеет знака. По сути, он обрабатывается так, как если бы это были положительные числа.

С другой стороны, поскольку у нас 256 комбинаций, что, если мы назначим половину из них как положительные числа, а другая половина - отрицательные числа? Итак, мы присваиваем положительное или отрицательное значение байтовому представлению:

byte: 0 1 1 1 1 1 1 1  <- Represents a "127"
byte: 0 1 1 1 1 1 1 0  <- Represents a "126"

        .. so on ..

byte: 0 0 0 0 0 0 0 1  <- Represents a "0"
byte: 0 0 0 0 0 0 0 0  <- Represents a "0"
byte: 1 1 1 1 1 1 1 1  <- Represents a "-1"

        .. so on ..

byte: 1 0 0 0 0 0 0 1  <- Represents a "-127"
byte: 1 0 0 0 0 0 0 0  <- Represents a "-128"

Вышеупомянутое представление называется системой «два дополнения», а таблица выше была адаптирована из статьи Википедии о дополнении двоих .

При таком типе представления в одних и тех же 8 битах мы можем определить способ представления диапазона чисел от -128 до 127. Это представление обычно называется signed byte, потому что это тип byte, который может иметь как положительные, так и отрицательные представления числа.

При сравнении unsigned byte и signed byte их диапазоны различны:

unsigned byte :       0  -  255
signed byte   :    -128  -  127

Однако оба имеют 256 возможных комбинаций значений, которые они могут представлять. Они отличаются только диапазоном значений, которые они могут представлять. Это диапазон типа данных.

Аналогично, это может быть расширено до типов int, long, float, double. Количество битов, назначаемых каждому типу данных, различно. Например:

int:  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   <- 16 bits
long: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  <- 32 bits

Примечание. Фактическое число битов для каждого типа, например int и long, может зависеть от реализации и архитектуры, поэтому приведенная выше диаграмма не обязательно соответствует действительности.

На приведенной выше диаграмме тип int представлен 16-разрядными значениями, которые представляют собой комбинации 2^16 или 65536 значений, которые он может представлять. Опять же, как и byte, диапазон значений может быть положительным или разбитым на положительные и отрицательные:

unsigned int  :       0  -  65535
signed int    :  -32768  -  32767

(Опять же, int не обязательно должен быть 16-разрядным.)

Типы с плавающей точкой , такие как float и double, также представлены битами в памяти, но их представление данных отличается от целочисленных типов данных, таких как byte и int тем, что они будут хранить значение в памяти в виде двоичных дробей и экспонент. Типы с плавающей точкой также имеют концепцию диапазонов.

Подробную информацию о том, как значения с плавающей запятой определяются и рассчитываются в современных системах, см. В В Википедии есть статья о IEEE-754 .

Диапазоны данных типа данных возникают из комбинаций значений, которые могут быть представлены из объема памяти, выделенного для одной единицы одного типа данных, и из того, как эти возможные комбинации назначаются фактическим значениям, которые они представляют.

6 голосов
/ 03 июня 2009

Диапазон означает максимальное и минимальное значение, которое может храниться в переменной данного типа. Например, если у вас есть unsigned char и мы предполагаем, что размер типа данных равен 8 битам, вы можете хранить в нем значения в диапазоне от 0 до 2 ^ 8-1, т.е.

2 голосов
/ 03 июня 2009

Большинство типов в C зависит от машины, поэтому вы должны смотреть в limit.h, предоставленном вашим компилятором для вашей архитектуры.

Существует также ручной способ проверить это для порядковых типов:

  • если не подписано: min = 0, max = 2**(sizeof(type)*8)-1
  • если подписано: min = -2**(sizeof(type)*8-1), max = 2**(sizeof(type)*8-1)-1

Для значений с плавающей запятой вы можете взглянуть на стандарт IEEE 754, так как это наиболее распространенный формат, используемый почти во всех архитектурах.

EDIT:

Определение диапазона - это разница между максимальным и минимальным значениями, которые может содержать тип. Для порядковых типов это 2**(sizeof(type)*8).

2 голосов
/ 03 июня 2009

Диапазон переменной

Диапазон переменной задается как разница между самым высоким и самым низким значением, которое может содержать эта переменная. Например, диапазон 16-разрядной целочисленной переменной со знаком составляет от -32 768 до +32 767. В случае целого числа определение переменной ограничено только целыми числами, и диапазон будет охватывать каждое число в пределах его диапазона (включая максимальное и минимальное). Однако для других числовых типов, таких как числа с плавающей запятой, диапазон выражает только самое большое и самое маленькое число, которое может быть сохранено - в пределах диапазона будет много чисел, которые не могут быть представлены.

Из википедии

2 голосов
/ 03 июня 2009

вы должны взглянуть на limit.h в вашем стандартном include-пути. Есть точные диапазоны для вашей машины

1 голос
/ 03 июня 2009

подробнее о типах данных в c и их диапазонах: здесь

0 голосов
/ 03 июня 2009

На x86, char - 1 байт, short - 2, int - 4, float - 4, double - 8

.

В зависимости от того, как вы их используете (со знаком или без знака), вы можете рассчитать диапазон на основе этого.

0 голосов
/ 03 июня 2009

Диапазон - это диапазон значений, которые может использовать тип данных, определенный между его минимальным и максимальным значениями.

0 голосов
/ 03 июня 2009

Диапазон - это минимальное и максимальное значение, поддерживаемое для этого типа данных.

Целые числа в C имеют значение 16-bit.

Подпись int будет -32768 до 32767, т.е. (-2^15) до (2^15 -1)

Без знака int: 0 to 65535, т.е. 0 to (2^16)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...