Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на C# для чайников


Visual C# для чайников. Урок 4. Переменные

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

Console.WriteLine(2 + 2);

Console.Read();

 

И программа выдает у нас ответ: 4. Но если нам надо посчитать, допустим, 5+7, что снова писать программу? Размается, нет, мы можем написать программу, которая предложит ввести два числа и просуммирует их:

 

int a = Convert.ToInt16(Console.ReadLine());

int b = Convert.ToInt16(Console.ReadLine());

Console.WriteLine(a + b);

Console.Read();

 

Функция Convert.ToInt16 служит для преобразования типов данных. Мы ее разберем в будущих уроках, а пока просто запомните, что ReadLine возвращает введенный пользователем текст в виде строки, и его нельзя напрямую присваивать перемой, предназначенной для хранения числа. 

Теперь давайте разберемся, что же такое int. Это у нас тип переменной. Может быть, например и string, как в прошлом уроке.  Тогда бы в ней хранилось не число, а строка. Почему для строк и чисел мы применяем разные типы переменных? Да потому, что храниться они по разному. Да и операции с числам и со строками можно разные сделать. Например, мы не может разделить одну строку на вторую, это будет просто бессмысленная операция.

И так, как же хранится содержимое переменной в памяти компьютера? Наверное, вы вкурсе, что компьютер понимает только нули и единицы, и любая информация в нем кодируются только этими двумя цифрами. И этого достаточно. Если у нас 8 нулей или единиц (байт), то в них мы можем закодировать 256 комбинаций. Этого хватит, что бы закодировать русский, английский алфавит и специальные символы.  Цифра - тоже символ, поэтому ее можно закодировать. Тогда число у нас будет представлено в виде последовательности байт. Именно это и произойдет, если мы напишем что то вроде:

 

string sVar = "123";

 

Только вот арифметические операции производить с такими последовательностями компьютер не может. Что бы сложить, вычесть, умножить или разделить число компьютеру нужно представить ее в двоичной системе счисления. Например, число 123 в этой системе будет выглядеть так: 1111011, а 1234 вот так: 10011010010. 

А сейчас мы узнаем, что же такое int. Это слово означает, что для данной переменной мы выделяем в памяти 4-байта, и будем хранить в этих 4 байтах целые числа. При чем как положительные, так и отрицательные. Значит, 1 бит из 4-четрыех байтов (в 1 байте 8 бит), мы выделяем под знак. У нас остается 31 бит. Таким образом, мы можем хранить в этой переменной числа до 231 в обе стороны, а если точнее от -2 147 483 648 до 2 147 483 647. Если этого мало (хотя число большое, но есть и более большие числа, чем 2 миллиарда), то мы можем использовать long - 8 байтные переменные. Они могут хранить числа еще в 4 миллиарда раз большие, чем int. С другой стороны, если мы точно знаем, что у нас число не будет больше чем 32767 (или меньше чем 32768) то мы можем выделить для этого числа всего два байта. Это тип обозначается словом short. Существуют так же беззнаковые типы, в них можно хранить только положительные числа. Но и умещаются туда в два раза большие большие числа. Это типы ushort, uint и ulong для 2-х, 4-х и 8-ми байтовых чисел соответственно. Есть еще типы byte - для однобайтовых беззнаковых чисел от 0 до 255 и sbyte для однобайтовых знаковых чисел (от -128 до 127). 

Чувствую, у вас назревает вопрос: "А что, в C# только целые числа можно использовать? А как же дроби?".

Дробные числа тоже поддерживаются. Естественно, формат их хранения отличается от целых. Там есть еще точка. Но в целом, принцип представления тот же, что и для целых - двоичный код. Дробные числа, или, как их еще называют числа с плавающей точкой в C# могут быть float (8-байтное представление, от 1.5*10-45 до 3.4*1038) и double (16 - байтное представление от 5*10-324 до 1.7*10308. Спросите, как такие огромные числа помещаются  всего в 8 или 16 байт? Очень просто, храниться не все число, а только несколько его цифр, обеспечивающих заданную точность. Иными словами, в отличии от целых чисел, числа с плавающей точкой задаются, хотя и с очень маленькой, но погрешностью. И это естественно, вы не можете например, точно вычислить сколько будет, допустим, 10/3, так как тут получается бесконечная (периодическая) дробь. В частности, точность типа flaot 6-7 десятичных цифр, double 15-16.

 Вы спросите, а зачем числа делить на целые и дробные? Почему бы не использовать только дробные числа? На самом деле ответ лежит на поверхности. В реальной жизни мы имеем дело с делимыми и неделимыми, целыми предметами. Например, мы не можем сказать 1,01 бутылки пива. Но мы может сказать: 0,505 литра пива. Что будет, если в компьютере мы для счета штучных предметов будем использовать дробные числа? Если мы напишем:

 

float a=1;

 

то запросто можется оказаться, что в этой переменной содержаться не 1, а 1,0000000000001 или 0.999999999999. Тогда, у нас может оказаться, что 1<>1. Действительно, если  первая единица это на самом деле 1,0000000000001, а вторая 0.999999999999 то так и есть. Но, из за ограничения точности оба числа у нас будут представлены как 1.  Вы спросите, почему так происходит? Давайте разберемся. Как будет представлено в двоичном коде число 2,5? Разумеется, 10,1. 2,25 будет как 10,01. 2,125 в двоичном коде будет выглядеть 10,001. А 2,1? Что бы представить одну десятую в двоичном коде, на 1 разделить на 1010. В итоге мы получим периодическую дробь. Но так как точность у нас ограничена, мы эту периодическую дробь округляем и в итоге получаем не 2,1, а что то типа 2,10000000001 или 2,099999999999. 

В C# есть еще один тип чисел, которые избавлены от недостатка float, но, тем не менее, могу быть дробными. Это числа типа decimal. Они могут быть от 10-28 до 1028. Казалось бы, вот золотая середина! decimal - самое лучше и int с float вроде бы как не нужны. Но... За все надо платить!. Вычисления с этим форматом представления чисел очень  медленное, примерно в 50 раз медленнее, чем в случае с целыми числами. Однако, в том случае, когда нам важна точность и мы не можем применять целые числа, например, в финансовых вычислениях, мы вынуждены использовать decimal. Хотя, в финансовых расчета, например, мы можем все расчеты делать в копейках, представляя их целыми числами, а потом перевести в рубли, представив их в decimal (в случае, если наша программа "тормозит" и мы решили ее оптимизировать). 

 

Разумеется,  кроме строк и чисел в переменных можно хранить и другие данные. Но о них мы узнаем из будущих уроков.

 

(С) Шуравин Александр

 


В избранное