Казалось бы

Предыдущая тема Следующая тема Перейти вниз

Казалось бы

Сообщение  Саня в Ср Мар 23, 2011 9:17 pm

Скажите, что напечатает прога и почему Laughing :
Код:

 Dim As UInteger foo, guu

Dim _numId As UInteger = 3
Dim  index As Integer = -4
Dim _len As UInteger = 9

foo = ( _len + ( _numId + index ) Mod _len  ) Mod _len

guu = ( _len + ( index + _numId ) Mod _len  ) Mod _len

? foo, guu

Sleep
лично мне такая фича не по душе, хотяя...
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Казалось бы

Сообщение  trew в Чт Мар 24, 2011 5:14 pm

Почему так, не знаю, но если взять обычный калькулятор, то результат не отличается от результата в твоем примере

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Казалось бы

Сообщение  Саня в Чт Мар 24, 2011 5:53 pm

ладно, для foo у меня получилось 3, а для guu - 8. Обьясню это так( имхо, если что )... у _numId тип целый без знака, а для index - целый со знаком, результат выражения _numId + index компилер будет считать целое число без знака, т.к. у первого числа такой тип, а вот у index + _numId будет целый тип со знаком, а в зависимости от этой особенности( читать тип ) будет зависеть тип операции mod.. а она пипец как зависит от типа делимого( думаю, что те, кто знает асму поймут почему )
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Казалось бы

Сообщение  DiG. GeRR в Пт Апр 01, 2011 9:08 am

Действительно, компилер в первом случае определяет тип суммы как беззнаковое и генерирует следующий код:

0040136F XOR EDX, EDX
00401371 DIV DWORD PTR SS:[EBP-18]
00401374 MOV EAX, EDX

а во втором случае считает сумму знаковой и создает вот это:

00401389 CDQ
0040138A IDIV DWORD PTR SS:[EBP-18]
0040138D MOV EAX, EDX

Может, это и фича такая (определение типа по первой переменной), но весьма опасная, и я бы на месте разработчиков ее исправил. Для программиста это совсем не очевидно, к тому же в большинстве языков определяются строго определяются правила, по которым преобразуются типы, независимо от порядка. К тому же в документации FB нет ни слова о подобной особенности поведения, даже наоборот:


When two different data types are used in a binary operation, like + (Addition) or = (Assignment), the smaller data type is automatically promoted to the larger data type regardless of the order in which the arguments are given.

и


All unsigned integer types are handling like signed integer types for the purpose of promotion, and the most significant bit is extended (sign extension).

Выходит, если компилер соответсвует своей документации, то результат должен быть всегда 8? Но, если такой код написать на С, то результат - 3?


DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Казалось бы

Сообщение  VerhoLom в Пт Апр 29, 2011 1:41 pm

отсюда вывод: старайтесь пользоваться однотипными переменными... Exclamation Хотя по-своему это приучает следить за кодом... pig
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Казалось бы

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения