Лекция 2. Целые числа. Цикл while.

TODO определение переменных

Машинное слово – размер регистра процессора (например, 32 бита, 64 бита). Определяет размер целых чисел, с которыми процессор может выполнять действия за одну операцию, а так же размер памяти, которую можно пронумеровать с помощью таких целых чисел.

32 бита – 2^32 байт = 4 ГБайт

64 бита – 2^64 байт = 16 эксабайт ( приблизительно 16 миллионов терабайт)

Тип данных Размер по стандарту Intel 32 Intel 64 Формат printf
char =1 1 1 %d
short >= 2 2 2 %d
int >= 2 4 4 %d
long >= 4 4 8 %ld

Чаще всего правильным способом определить размер числа в байтах будет применения оператора sizeof(тип). Например, sizeof(int) равен 4.

int size;
size = sizeof(int);
printf("%d\n", size);   // выведет 4

TODO литералы целых чисел

Чтобы определить “вместимость” каждого из этих типов данных, воспользуется простым утверждением:

Последовательность из n бит может содержать 2^n различных значений.

Доказательство:

  1. Докажем по индукции:

  2. 1 бит: 2 значения: 0 или 1.

  3. Пусть верно для n бит, тогда для n+1 мы получаем последовательности следующего вида

    0 ...последовательность длиной n...
    1 ...последовательность длиной n...
    

в сумме \(2^n + 2^n = 2^{n + 1}\)

Целые числа без знака

Тип числа дополняется модификатором (unsigned). Число байт на число при этом не меняется.

unsigned char = 20;
// Число размером 1 байт, может принимать 2^8 == 256 значений от 0 до 255 включительно.

На уровне битов числа без знака представляются в уже знакомой нам двоичной системе исчисления:

\(00000000_2 = 0\)

\(00000001_2 = 1\)

\(...\)

\(11111110_2 = 254\)

\(11111111_2 = 255\)

Тип данных минимум максимум константы из limits.h
unsigned char 0 \(2^8 - 1\) UINT_MIN
unsigned short 0 \(2^{16} - 1\) USHORT_MAX
unsigned int 0 \(2^{32} - 1\) UINT_MAX
unsigned long 0 \(2^{sizeof(long)} - 1\) ULONG_MAX

sizeof(long) зависит от архитектуры

Приведение типов при присваивании

Общее правило: если при присваивании значению X типа \(T_1\) значения типа \(T_2\) значение X принадлежит диапазону значений типа T_2, то оно будет преобразовано само в себя.

Если при присвоении значению типа T_2, где sizeof(T_1) > sizeof(T_2), значение будет дополнено нулями слева

TODO картинка

unsigned char  c = 5;  //  00000101
unsinged int x = c; // 0..000000101

Если при присвоении значению типа T1 значения типа T_2, sizeof(T1) < sizeof(T2), старшие разряды, не помещающиеся в T1, будут отброшены.

unsigned int x = 361;   // 0..0100000101
unsigned char c = x;    //      00000101

Числа со знаком

char c = -10;
// 1 байт; 256 значений от -128 до 127
\[00000000_2 = 0\]\[00000001_2 = 0\]\[...\]\[01111111_2 = 127\]\[10000000_2 = -128\]\[10000001_2 = -127\]\[...\]\[11111111_2 = -1\]

Вес старшего бита \(-2^{n-1}\)

 11111111
+
 11111111
 --------
111111110

-1 + (-1) == -2
Тип данных минимум максимум константы из limits.h
char -128 127 INT_MIN, ITN_MAX
short \(-2^{15}\) \(2^{15} - 1\) SHRT_MIN, SHRT_MAX
int \(-2^{31}\) \(2^{31} - 1\) INT_MIN, INT_MAX
long \(-2^{sizeof(long)-1}\) \(2^{sizeof(long)-1} - 1\) LONG_MIN, LONG_MAX

Правила приведения типов:

  1. Если один из операндов со знаком, а другой без, то операнд со знаком приведётся к числу без знака.
  2. Если один из операндов long long, то другой тоже приводится к long long
  3. Если один из операндов long, то другой тоже приводится к long
  4. Если ни один из операндов не long и не long long, оба операнда будут приведены к int.

TODO while

TODO while с одной инструкцией

TODO while без тела цикла