![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| kurzon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.8.2007 Репутация: -8 Всего: -11 |
Ето побитное додавание с права на ливо Пачему компилятор выводит: x=0; y=1984; Обсянить поподробней? Это сообщение отредактировал(а) kurzon - 20.9.2007, 13:00 |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
kurzon, извини пожалуйста, но в подобной белиберде сам разбирайся. Неужели тяжело было разбить то же самое на несколько строчек? |
|||
|
||||
| Sartorius |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
Кста, при разбиении все работает корректно.
kurzon, посмотри что в MSIL получается |
||||
|
|||||
| tol05 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
а что удивляться? Строка
это не
это
т.е. , если в числах, x = 1984 ^(2001^(1984^2001)); или x = 1984 ^ 1984; -------------------- На хорошей работе и сны хорошие снятся. |
||||||
|
|||||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
tol05,
Это почему? Посмотри хотя бы на то, что в приведенном тобой выражении значение y не меняется. |
|||
|
||||
| Freak_FB |
|
||||
![]() Ктулхувед ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 13.10.2006 Репутация: 1 Всего: 4 |
Известен метод обмена значениями двух переменных. Но работало это в C++, компилятор которого трактует такой бред иначе, чем компилятор C#.
|
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Ага, этот метод когда-то популяризировал Крис Касперски в журнале Хакер, вот и подхватили, хотя я в нём никаких достоинств не вижу.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
видно что компилятор сохраняет первоночальное значени x и когда дело доходит до последнего (левого) ^= использует его. А в y - уже старое значение x. Вот и 0 ЗЫ еще один пример того, что короткая запись совсем не обязательно лучшая |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
я проверил еще раз все, что написал. Все верно. Но что значит "приведенном тобой выражении значение y не меняется"?
Просто пример я упростил до такого вида. Мог бы написать у = y^(x ^ y) x = x ^у тогда бы у менялась? дела это не меняет и лезть в скомпилированный код ради этого не нужно. Операции имеют приоритет и порядок выполнения (слева-направо или справа-налево). В данном случае результат объясним, а каким образом, через x или через y .... Результат все равно не изменит -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Все нужно. Ассемблер показывает, что значения x и y подставляются перед выполнением строки. Т.е. в последней операции вместо y берется его первоначальное значение (2001), а не полученное в результате предыдущих преобразований (1984). Вот и получается 1984^1984 = 0 Короче, это неопределённое поведение, типа как значение выражения ++i + ++i (http://forum.vingrad.ru/index.php?show_type=forum&showtopic=150528) |
|||
|
||||
| kurzon |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.8.2007 Репутация: -8 Всего: -11 |
Ето побитное додавание, пачему другой результат, если побитно додавать то результат будет такойже как и по обычном додавать... Добавлено через 7 минут и 49 секунд
Пачему x=0 Но никак не пойму, обяснить? Я думал по механизму етому x=x+y; |
||||
|
|||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
это поразрядное исключающее или. Ставит единицы в разрядах, который не совпадают. А если два числа совпадают, то в результате одни нули. по приведенному ассемблеру я вижу другое... Но спорить не хочу. Не люблю длинных топиков x = 1984 ^(2001^(1984^2001)); давайте сверим это с ассемблером (как принято выражаться "любезно предоставленным нам Sartorius") 00000017 mov edi,7C0h // в edi помещенo 1984 int y = 2001; // (0x7d1) 0000001c mov ebx,7D1h //в edi помещен x, в еbx - y (в еbx помещено 2001) x ^= y ^= x ^= y; 00000021 mov esi,edi // зачем-то сохраняем х в еsi 00000023 xor edi,ebx // в edi помещенo 1984^2001 это 17 00000025 xor ebx,edi // теперь в ebx(y) старое значение X нет (edi изменен) помещаем в ebx 2001^17 это 1984 00000027 xor esi,ebx // обнуляем esiнет (ebx изменен) помещаем в esi 1984^1984 это 0!!! //первый 1984 - это старый х, а второй 1984 - результат предыдущей строки 00000029 mov edi,esi //и сохраняем это в х (0 помещаем в x) ну дальше рассмотрен вариант Sartorius, тут действительно все ясно что скажете? Это сообщение отредактировал(а) tol05 - 20.9.2007, 21:26 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Я тут ошибся. Дело в x-е. При подходе к последнему выражению (самому внешнему) x изменился (стал 2001), но используется его изначальное значение (1994)... В подтверждении моих слов следующий код отрабатывает корректно:
А все из-за того, что в двухстрочном варианте в качестве х берётся его новое значение, а не старое как в однострочном... Добавлено @ 09:33 Строки 27 и 29 показывают, что комп достаёт ранее сохранённое в esi значение, производит над ним xor со значением y и сохраняет в x (edi) Это сообщение отредактировал(а) ivashkanet - 21.9.2007, 09:33 |
||||
|
|||||
| kurzon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.8.2007 Репутация: -8 Всего: -11 |
А как переколировать в асемблер?
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |