Есть две причины, почему вы должны быть обеспокоены различными числовыми типами данных.
1. Сохранение памяти
for(long k=0;k<=10;k++)
{
//stuff
}
Зачем использовать long, если он может быть просто целым числом или даже байтом? Таким образом, вы действительно сэкономите несколько байтов памяти.
2. Числа с плавающей точкой и целые числа хранятся по-разному в компьютере
Предположим, что у нас есть число 22, хранящееся в целом числе. Компьютер хранит этот номер в памяти в двоичном виде как:
0000 0000 0000 0000 0000 0000 0001 0110
Если вы не знакомы с системой двоичных чисел, это может быть представлено в научной нотации как: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. Последний бит может или не может использоваться для указания, является ли число отрицательным (в зависимости от того, является ли тип данных подписанным или беззнаковым).
По сути, это просто сумма 2 ^ (разрядное место) * значение.
Это меняется, когда вы ссылаетесь на значения, включающие десятичную точку. Предположим, у вас есть число 3.75 в десятичном виде. Это упоминается как 11.11 в двоичном формате. Мы можем представить это как научное обозначение как 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 или, нормализовано, как 1.111 * 2 ^ 2
Однако компьютер не может сохранить это: у него нет явного метода выражения этой двоичной точки (версия десятичной точки в двоичной системе счисления). Компьютер может хранить только 1 и 0. Вот где приходит тип данных с плавающей точкой.
Предполагая, что sizeof (float) составляет 4 байта, тогда у вас есть 32 бита. Первый бит присваивается «знаковый бит». Там нет беззнаковых поплавков или двойников. Следующие 8 бит используются как «показатель степени», а последние 23 бита используются как «значение» (или иногда их называют мантиссой). Используя наш пример 3.75, наш показатель будет равен 2 ^ 1, а наше значение равно 1.111.
Если первый бит равен 1, число является отрицательным. Если нет, то положительный. Экспонента модифицируется чем-то, что называется «смещением», поэтому мы не можем просто сохранить «0000 0010» в качестве экспоненты. Смещение для числа с плавающей запятой одинарной точности равно 127, а смещение для двойной точности (в этом случае двойной тип данных получает свое имя) равно 1023. Последние 23 бита зарезервированы для значимого. Значение и просто значения ПРАВА нашей двоичной точки.
Наш показатель будет смещением (127) + показатель (1) или представлен в двоичном виде
1000 0000
Наше значение и будет:
111 0000 0000 0000 0000 0000
Следовательно, 3.75 представляется как:
0100 0000 0111 0000 0000 0000 0000 0000
Теперь давайте посмотрим на число 8, представленное как число с плавающей запятой и как целое число:
0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000
Как в мире компьютер собирается добавить 8,0 и 8? Или даже умножить их !? Компьютеры (точнее, компьютеры x86) имеют разные части ЦП, которые добавляют числа с плавающей запятой и целые числа.