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