powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос на засыпку!
10 сообщений из 10, страница 1 из 1
Вопрос на засыпку!
    #38516065
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
        public const int GB = 1073741824;

        static void Main(string[] args)
        {
            int k = 11;            
            long size = Convert.ToUInt32(k) * GB; //size = 3221225472 - НЕ ПРАВИЛЬНО
        }



и

Код: c#
1.
2.
3.
4.
5.
6.
        static void Main(string[] args)
        {
            int k = 11;
            int GB = 1073741824;
            long size = Convert.ToUInt32(k) * GB; //size = 11811160064 - ПРАВИЛЬНО
        }



в чём разница?
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516109
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,
Интересно.
Что-то с приведением типов?

Вот так :

Код: c#
1.
long size = Convert.ToUInt32(k) * (long)GB;



всегда правильно.
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516111
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это вообще не компилируется:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	public const int GB = 1073741824;

		static void Main(string[] args)
		{
			int k = 11;
			long size = Convert.ToUInt32(k) * (long)GB; //size = 3221225472 - НЕ ПРАВИЛЬНО

			long size2 = 11 * GB;
			SecondTry();

		}



Переполнение стека при вычислении константы.
....
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516116
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students, в первом случае перемножаются значения uint, а втором long. Почему происходит именно так надо смотреть в спецификации языка. Непонятно почему ты приводишь значение к uint когда итоговое значение туда не помещается. Если бы ты сразу написал long size = (long)k * GB, то проблем не было.
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516117
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

Код: c#
1.
2.
3.
4.
5.
6.
        static void Main(string[] args)
        {
            int k = 11;
            // int GB = 1073741824;
            long size = Convert.ToUInt32(k) * 1073741824; //size = МММ?
        }
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516121
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Переполнение стека при вычислении константы.
....

Собственно функция Convert.ToUInt32(k)
использована только для того, чтобы компилятор не пробовал вычислить значение выражения сразу, и подставить его в IL

....
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516122
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileПочему происходит именно так надо смотреть в спецификации языка.
+1
А это и не проблема. Это загадка.
:-)
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516152
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students, похоже происходит следующее. При использовании константы компилятор подставляет значение 1073741824 в выражение. Т.к другой операнд имеет тип uint, то компилятор считает что значение GB тоже должно иметь тип uint. Поэтому вызывается operator*(uint,uint). Без константы срабатывает правило "numeric promotion" требующее привести все аргументы к long если хотя бы один из операндов имеет тип uint. Соответственно идет вызов operator*(long,long).
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516310
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, спасибо за ответы.

Сделал как вы написали, всё работает.
...
Рейтинг: 0 / 0
Вопрос на засыпку!
    #38516858
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из этого следует вывод - если не уверены, то не делайте преобразований типов в вычислениях. Сначала обозначьте переменные с нужными типами, а потом с ними вычисляйте. А то напихают конвертеры и явные-неявные приведения в свои четырёхэтажные формулы, а потом два дня разбирают это дерьмо.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос на засыпку!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]