Целые типы


Числовые типы

С помощью целых чисел может быть представлено количество объектов, являющихся дискретными по своей природе (т.е. счетное число объектов).

ПРЕДСТАВЛЕНИЕ В ПАМЯТИ. Для представления чисел со знаком в ряде компьютеров был использован метод, называемый методом знака и значения. Обычно для знака отводится первый (или самый левый) бит двоичного числа, затем следует запись самого числа.

Например, +10 и -15 в двоичном виде можно представить так:

 

Число Знаковый бит Величина
+10
- 15

Отметим, что по соглашению 0 используется для представления знака плюс и 1 - для минуса. Такое представление удобно для программистов, т.к. легко воспринимается; но не является экономичным, поскольку при выполнении операций сложения и вычитания необходимо вначале определять знак каждого числа.

Например, сложение чисел +6 и -7 на самом деле подразумевает операцию вычитания, а вычитание -6 из +7 операцию сложения. Для анализа знакового бита требуется особая схема, и, кроме того, при представлении числа в виде знака и величины необходимы отдельные устройства для сложения и вычитания, т.е. если положительное и отрицательные числа представлены в прямом коде, операции над кодами знаков выполняются раздельно. Поэтому представление чисел в виде знака и значения не нашло широкого применения.

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

Дополнительный код отрицательного числа формируется по следующим правилам:

· модуль отрицательного числа записать в прямом коде, в неиспользуемые старшие биты записать нули;

· сформировать обратный код числа, для этого нуль заменить единицей, а единицу заменить нулем;

· к обратному коду числа прибавить единицу.

 

Например: для числа -33 в формате short

 

1000000000100001 прямой код

0111111111011110 обратный код

+______________1

1111111111011111 дополнительный код

 

Для положительных чисел прямой, обратный и дополнительный коды одинаковы. Аналогично представляются целые числа в формате sbyte, short, int, long.

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

20+21+22+…+2n-1 или ∑2i=2n-1.

При n-битовом хранении числа в дополнительном коде первый бит выражает знак целого числа. Поэтому положительные числа представляются в диапазоне от 0 до 1*20 + 1*21 +...+ 1*2n-2 или, что то же самое, от 0 до 2n-1-1. Все другие конфигурации битов выражают отрицательные числа в диапазоне

от -2n-1 до -1.

Таким образом, можно сказать, что число N может храниться в n разрядах памяти, если его значение находится в диапазоне:

-2n-1 <= N <= 2n-1- 1.

Иными словами, диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать 1, 2, 4 или 8 байт. В табл. 2.1 приводится перечень целых типов, размер памяти для их внутреннего представления в битах, диапазон возможных значений.

 

В C# определены девять целочисленных типов данных: char, byte, sbyte, short, ushort, int, uint, long и ulong. Тип данных char в основном применяется для представления символов и будет описан позже в этой главе. Остальные восемь типов используются для выполнения операций с числами. В следующей таблице перечислены эти типы, а также указано количество битов, выделяемых для представления числа, и диапазон возможных значений.

Таблица 2.1 Целочисленные типы

Тип Количество битов Диапазон значений
byte От 0 до 255
sbyte От -128 до 127
short От -32768 до 32767
ushort От 0 до 65535
int От -2147483648 до 2147483647
uint От 0 до 4294967295
long От -9223372036854775808 до 9223372036854775807
ulong От 0 до 18446774073709551615

Как показано в таблице, в C# определены как знаковые, так и беззнаковые варианты целочисленных типов. Различие между ними состоит в способе интерпретации старшего бита целого числа. Если указывается знаковое целое, то компилятор будет генерировать код, в котором предполагается интерпретация старшего бита целого числа как флага знака. Если флаг знака 0, то это положительное число; если флаг знака 1, то число отрицательное. Отрицательные числа практически всегда представлены с использованием метода двоичного дополнения. В этом методе все биты числа (за исключением флага знака) инвертируются, затем к этому числу прибавляется единица, в завершение флагу знака задается значение 1.

Знаковые целые важны для очень многих алгоритмов, но они имеют только половину абсолютной величины соответствующих беззнаковых целых. Например, запишем в двоичном представлении число типа short 32767:

01111111 11111111

Поскольку это знаковый тип, при задании старшему биту значения 1 число будет интерпретировано как -1 (если использовать метод двоичного дополнения). Но если вы объявляете его тип как ushort, то при задании старшему биту значения 1 число будет интерпретировано как 65535.

Пожалуй, наиболее часто используемым целочисленным типом является int. Переменные типа int часто применяют для управления циклами, для индексации массивов и в различных математических вычислениях. При работе с целочисленными значениями, большими, чем те, которые могут быть представлены типом int, в C# используют типы uint, long, ulong, а при работе с беззнаковым целым - тип uint. Для больших значений со знаком применяют тип long, для еще больших положительных чисел (беззнаковых целых) - тип ulong.

Ниже приведена программа, вычисляющая объем куба (в кубических дюймах), длина стороны которого равна 1 миле. Поскольку это значение довольно большое, для его хранения программа использует переменную типа long.

/*
Программа вычисляет объем куба (в кубических дюймах),
длина стороны которого равна 1 миле.
(Для справки: в одной миле 5280 футов, в одном футе 12 дюймов.
*/

using System;

class Inches {
public static void Main() {
long ci;
long im;

im = 5280 * 12;

ci = im * im * im;

Console.WriteLine("Объем куба с длиной стороны, равной 1 миле, "+
"\nравен "+ ci +" кубических дюймов.");
}
}

Ниже показан результат выполнения этой программы:

Объем куба с длиной стороны, равной 1 миле,
равен 254358061056000 кубических дюймов.

Очевидно, что такой результат не может быть помещен в переменную типа int или uint.

byte и sbyte - наименьшие целочисленные типы. Значение типа byte может находиться в диапазоне от 0 до 255. Переменные типа byte особенно полезны при использовании необработанных двоичных данных, таких как поток байтов данных, сгенерированный каким-либо устройством. Для небольших знаковых целых применяется тип sbyte. Представленная ниже программа использует переменную типа byte для контроля цикла for, в котором вычисляется сумма всех целых чисел, находящихся в диапазоне от 1 до 100.

// Использование типа byte.

using System;

class Use_byte {
public static void Main() {
byte x;
int sum;

sum = 0;
for(x = 1; x <= 100; x++)
sum = sum + x;
Console.WriteLine("Сумма всех целых чисел, находящихся "+
"в диапазоне от 1 до 100, \nравна " + sum);
}
}

Результат выполнения этой программы следующий:

Сумма всех целых чисел, находящихся в диапазоне от 1 до 100, равна 5050

Поскольку в данной программе для управления циклом for используются числа от 1 до 100, находящиеся в диапазоне значений, определенных для типа byte, нет необходимости назначать тип переменной, позволяющий работать с гораздо большими числами.

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

 

МАШИННОЕ ПРЕДСТАВЛЕНИЕ БЕЗЗНАКОВЫХ ТИПОВ

К беззнаковым типам в C# относятся целые типы с преставкой unsigned (беззнаковый), сокращенной до первой буквы u, а так же беззнаковое 8-битное целое - byte

Формат машинного представления чисел типа byte приведен на рис. 2.2,а.

 

Например: 1). Машинное представление числа 45:

45=25+23+22+20 = 00101101

2). Машинное представление границ диапазона допустимых значений чисел 0 и 255:

 

0: 00000000; 255: 11111111.

а) тип byte

 

               

7 0

 

б) тип ushort ( так же char – 16 битовый символ Unicode)

 

               
           
               
           

 

Рис. 2.2. Формат машинного представления беззнаковых чисел

 

Формат машинного представления чисел типа ushort приведен на

рис. 2.2, б.

 

Например:

1). Машинное представление числа 258:

257=28+21 = 00000001 00000010.

2). Машинное представление границ:

0: 00000000 00000000; 65535: 11111111 11111111.

 

МАШИННОЕ ПРЕДСТАВЛЕНИЕ ЧИСЕЛ СО ЗНАКОМ.

Для представления чисел со знаком определены следующие типы SBYTE, SHORT, INT, LONG. В приведенных типах числа хранятся в дополнительном коде. Напомним, что дополнительный код положительных чисел совпадает с прямым кодом.

Формат машинного представления чисел знакового целого типа приведен на рис. 2.3, а, где s - знаковый разряд числа. Для положительных чисел s = 0, для отрицательных s = 1.

 

Например:

машинное представление чисел в формате SBYTE:

1). 0: 00000000;

2). +127: 01111111;

3). -128: 10000000.

Формат машинного представления чисел типа SHORT приведен на

рис. 2.3, б.

 

Например:

1). +32765: 11111101 01111111;

2). -32765: 00000011 10000000;

3). -47: 11010001 11111111.

Машинное представление границ диапазона допустимых значений:

4). -32768: 00000000 10000000;

5). 32767: 11111111 01111111.

Формат машинного представления чисел типа LONG приведен на

рис. 2.3, в. Например:

1). +89 01011001 00000000 00000000 00000000;

2). -89 10100111 11111111 11111111 11111111.

 

a)sbyte

Рис. 2.3. Формат машинного представления чисел со знаком

 

На рис 2.3 s - знаковый бит числа. При этом, если s = 0, то число положительное, если s = 1 - число отрицательное. Цифры определяют номера разрядов памяти.