Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
30.12.2013, 17:16
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7.
и Код: c# 1. 2. 3. 4. 5. 6.
в чём разница? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:06
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Students, Интересно. Что-то с приведением типов? Вот так : Код: c# 1.
всегда правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:07
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
А вот это вообще не компилируется: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Переполнение стека при вычислении константы. .... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:12
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Students, в первом случае перемножаются значения uint, а втором long. Почему происходит именно так надо смотреть в спецификации языка. Непонятно почему ты приводишь значение к uint когда итоговое значение туда не помещается. Если бы ты сразу написал long size = (long)k * GB, то проблем не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:12
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Students, Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:13
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
D129Переполнение стека при вычислении константы. .... Собственно функция Convert.ToUInt32(k) использована только для того, чтобы компилятор не пробовал вычислить значение выражения сразу, и подставить его в IL .... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:14
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
bazileПочему происходит именно так надо смотреть в спецификации языка. +1 А это и не проблема. Это загадка. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.12.2013, 18:46
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Students, похоже происходит следующее. При использовании константы компилятор подставляет значение 1073741824 в выражение. Т.к другой операнд имеет тип uint, то компилятор считает что значение GB тоже должно иметь тип uint. Поэтому вызывается operator*(uint,uint). Без константы срабатывает правило "numeric promotion" требующее привести все аргументы к long если хотя бы один из операндов имеет тип uint. Соответственно идет вызов operator*(long,long). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.12.2013, 01:02
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
ясно, спасибо за ответы. Сделал как вы написали, всё работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.01.2014, 21:29
|
|||
---|---|---|---|
Вопрос на засыпку! |
|||
#18+
Из этого следует вывод - если не уверены, то не делайте преобразований типов в вычислениях. Сначала обозначьте переменные с нужными типами, а потом с ними вычисляйте. А то напихают конвертеры и явные-неявные приведения в свои четырёхэтажные формулы, а потом два дня разбирают это дерьмо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&tablet=1&tid=1403449]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
95ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 200ms |
0 / 0 |