Целочисленные литералы и суффиксы, как правильно это функционирует? - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток, снова непонимание, и неудача при поиске ответа, HELP! Имею следующий пример:
class Inches
{
    public static void Main()
    {
        long inches;
        int miles;
 
        miles = 93000000;
 
        Console.WriteLine(miles);
 
        inches = miles * 5280 * 12;
 
        Console.WriteLine("Расстояние составляет "+inches);
    }
    
};
Результат :

93000000 Расстояние составляет -215130112 Для продолжения нажмите любую клавишу . . .

Результат вычислений неправильный, на сколько я понимаю ошибка вызвана тем что значениям 5280 и 12 был автоматически присвоен тип Int. Вывод я такой сделал из этого комментария полученного методом гугль "Per MSDN "When an integer literal has no suffix, its type is the first of these types in which its value can be represented": int, uint, long, ulong." - Это верное утверждение? И что в таком случае происходит если я к примеру не буду явно определять тип для литералов с плавающей запятой? Вот следующий вариант:
class Inches
{
    public static void Main()
    {
        long inches;
        int miles;
 
        miles = 93000000;
 
        Console.WriteLine(miles);
 
        inches = miles * 5280 * 12L;
 
        Console.WriteLine("Расстояние составляет "+inches);
    }
    
};
Результат :

93000000 Расстояние составляет -215130112 Для продолжения нажмите любую клавишу . . .

В данном случае ответ тоже не верный, получается у нас что 5280 это int а 12 я определил как long. Так, продолжаю значит я дальше:
class Inches
{
    public static void Main()
    {
        long inches;
        int miles;
 
        miles = 93000000;
 
        Console.WriteLine(miles);
 
        inches = miles * 5280L * 12;
 
        Console.WriteLine("Расстояние составляет "+inches);
    }
    
};
Результат :

93000000 Расстояние составляет 5892480000000 Для продолжения нажмите любую клавишу . . .

Собственно тут ответ верный, причем разница с предыдущем листингом состоит только в том, что я определил уже 5280 как long, а 12 не трогал (на сколько я понял он в данном случае числиться как int). Ну и в последнем случае, я ставлю суффикс L и около 12 и около 5280, результат получаю верный. Если утверждение "Per MSDN "When an integer literal has no suffix, its type is the first of these types in which its value can be represented": int, uint, long, ulong." верное, тогда я понимаю природу ошибки, однако я совсем не понимаю как конкретно происходят вычисления и преобразования типов. И как в результате получаются такие значения . Был бы очень рад если бы кто-то объяснил как точно происходят вычисления в каждом примере и как правильно поступать в таких случаях. Также интересует ситуация с плавающей точкой. P.S. Либо дайте хотя бы ссылочку где можно порыться. А еще меня интересует почему преобразование начинается с int, а не с byte and sbyte ведь так место вроде же экономиться?

Решение задачи: «Целочисленные литералы и суффиксы, как правильно это функционирует?»

textual
Листинг программы
int operator *(int x, int y);
uint operator *(uint x, uint y);
long operator *(long x, long y);
ulong operator *(ulong x, ulong y);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы