Перейти к содержимому


Фотография
- - - - -

Оригинальное задание


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 67

#51 mefody

mefody

    Новичок

  • Новичок
  • Pip
  • 14 сообщений
  • 0 тем
  • Регистрация:26 Май 2006

Отправлено 28 Май 2006 - 18:13

Ваш код не соответствует стандарту С и С++. Под зависимость от реализации понимают зависимость от компилятора и его право определить гарантию использования, например, для платформы x86 арифметического сдвига для знаковых.

что значит "не соответсвует"? если в стандарте описано как implementation-defined то эти операции вообще нельзя использовать? или чтобы соответствовать стандарту надо обрамлять код в
#ifdef _такой-то_конкретный_копимлятор_
_делать_так_
#elseif _другой-то_конкретный_копимлятор_
_не_делать_так_
#e....if
???

тогда уж скажите в, в каких конктретно компиляторах для x86 битовый свдиг вправо для отрицательных чисел не эквивалентен делению на 2 в степени второй_аргумент.
  • 0

#52 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 28 Май 2006 - 20:40

что значит "не соответсвует"? если в стандарте описано как implementation-defined то эти операции вообще нельзя использовать? или чтобы соответствовать стандарту надо обрамлять код в #ifdef _такой-то_конкретный_копимлятор_ ?

Вы привели код (из обсуждения мне видится вероятным, что это код на С или С++), я лишь смею заметить, что ваш код компиляторозависим, если он на С или С++. Что с этим делать - решайте сами.

тогда уж скажите в, в каких конктретно компиляторах для x86 битовый свдиг вправо для отрицательных чисел не эквивалентен делению на 2 в степени второй_аргумент.

Я надеюсь, вы не собираетесь доказать, что все возможные компиляторы, выполняющие стандарт, для x86 будут использовать арифметический сдвиг.

Сообщение отредактировал RItt: 28 Май 2006 - 20:58

  • 0

#53 zz7

zz7

    Двуликий Янус

  • Новичок
  • PipPipPipPipPipPip
  • 849 сообщений
  • 52 тем
  • Регистрация:14 Май 2004
  • Город:Колыбель космонавтики

Отправлено 28 Май 2006 - 21:33

какой кошмар.*выбегает из треда*
  • 0
Старший Брат смотрит на тебя!

#54 mefody

mefody

    Новичок

  • Новичок
  • Pip
  • 14 сообщений
  • 0 тем
  • Регистрация:26 Май 2006

Отправлено 28 Май 2006 - 23:49

Вы привели код (из обсуждения мне видится вероятным, что это код на С или С++), я лишь смею заметить, что ваш код компиляторозависим, если он на С или С++. Что с этим делать - решайте сами.Я надеюсь, вы не собираетесь доказать, что все возможные компиляторы, выполняющие стандарт, для x86 будут использовать арифметический сдвиг.

да, я подразумевал C/C++Я думаю, что все норамальные компиляторы будут делать именно так, остальные компиляторы в топку.
  • 0

#55 walenok

walenok

    Продвинутый

  • Новичок
  • PipPipPip
  • 222 сообщений
  • 4 тем
  • Регистрация:15 Окт 2004
  • Город:Москва

Отправлено 29 Май 2006 - 02:56

да, я подразумевал C/C++Я думаю, что все норамальные компиляторы будут делать именно так, остальные компиляторы в топку.

Нормальные - это какие?Вообще, закладываться на тонкости реализации - полезно, но, потенциально является источником очень веселых ошибок (помнится, было очень весело писать код, который должен был компилироваться как на 16-ти, так и на 32-х битной платформе).Да и сейчас, когда даю волю привычкам, регулярно огребаю кучу предупреждений, что size_t - совсем не int.Отменят завтра использование SAR/SAL как медленное - и будет масса веселых ошибок.С другой стороны, для трюкового использования (а речь идет о нем) - все средства хороши.ЗЫ. Писал я как-то, помнится для машинки, где char был 6-ти битный....
  • 0
Мир спасут красота и ковровые бомбардировки

#56 Bolan

Bolan

    шволочь

  • Жильцы
  • PipPipPipPipPipPipPipPip
  • 3 296 сообщений
  • 54 тем
  • Регистрация:23 Сен 2005
  • Пол:Мужчина

Отправлено 29 Май 2006 - 08:07

да, я подразумевал C/C++Я думаю, что все норамальные компиляторы будут делать именно так, остальные компиляторы в топку.

ммм... мир не ограничен х86. щас до фортеце доберусь, гляну. интересно стало.
  • 0

#57 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 29 Май 2006 - 20:49

В стандарте умолчание не прописано. Во всех виденных мной компиляторах, если не указан соответствующий ключ, int и char - signed.

Только char то исключение: char, signed char и unsigned char это все разные типы по стандарту (цитирование стандарта С++ тут, кажется, не популярно, поэтому контрпример;)
void f(unsigned char) {}void f(signed char) {}void f(char) {}void f(unsigned int) {}void f(signed int) {}//void f(int) {} //  errorint main(){	char c;	unsigned char uc;	signed char sc;	f(c);	f(uc);	f(sc);	int i;	unsigned int ui;	signed int si;	f(i);	f(ui);	f(si);	return 0;}
И еще, интересно, почему никто не стал минимум из двух целых примерно так находить:
	int a;	int b;// 1 вариант	int result = a * (a<b) + b * (a>=b);// 2 вариант для тех кто не любит умножение	unsigned int t = a<b;	int result = b & (t-1)  |  a & ~(t-1);	// 3 вариант для тех кто не любит "лишних переменных";)	int result = a & (-1+static_cast<unsigned int>(a>=b))  |  b & (-1+static_cast<unsigned int>(a<b));

Сообщение отредактировал RItt: 29 Май 2006 - 21:27

  • 0

#58 Ares

Ares

    Продвинутый

  • Новичок
  • PipPipPip
  • 187 сообщений
  • 12 тем
  • Регистрация:20 Май 2005

Отправлено 30 Май 2006 - 09:57

2 RIttНаходим минимум int a = 2; int b = 3;// 1 вариант int result = a * (a<b) + b * (a>=b );//под (a<b) надо понимать (a<<b) т.е. a * 2 в степени b, а a>=b (a>>=b ), если я не правильно// понимаю, то поясните. Возможно досадная очепятка :)//в данном случае result = 2 * 2 * 2 * 2 * 2 + 3 * 0, как видите совсем другое число// 2 вариант для тех кто не любит умножениеОпять не очень понятно с unsigned int t = a<b;В принципе возможно и будет работаь, если unsigned int t = a<<b? Но не знаю..... Не охота особо заморачиваться// 3 вариант для тех кто не любит "лишних переменных";)Честно говоря не очень понял static_cast<unsigned int>, увы давно не заморачивался, поподробнее прокомментируйте если не трудно

Сообщение отредактировал Ares: 30 Май 2006 - 09:58

  • 0
ЮРОДИВЫЙ

#59 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 31 Май 2006 - 20:33

2 RItt int result = a * (a<b) + b * (a>=b );под (a<b) надо понимать (a<<b) т.е. a * 2 в степени b, а a>=b (a>>=b ), если я не правильно понимаю, то поясните. Возможно досадная очепятка :)

"<" и ">=" это то, что написано - операторы сравнения, было бы странным опечататься 5 раз из 5...Разве здесь сказано про запрет операторов сравнения? (я понимаю задачу как, написать безбранчевый код (раз "и циклических" и подтверждают эту мысль и дальнейшие ответы)

Даны 2 целых чила. Необходимо найти наименьшее из них без использования условных и циклических опрераторов.

Кстати, а ?: считается условным оператором?a < b ? a:b

это есть краткая форма записи условного оператора)))

Честно говоря не очень понял static_cast<unsigned int>, увы давно не заморачивался, поподробнее прокомментируйте если не трудно

http://www.rsdn.ru/a...static_cast.xml
  • 0

#60 walenok

walenok

    Продвинутый

  • Новичок
  • PipPipPip
  • 222 сообщений
  • 4 тем
  • Регистрация:15 Окт 2004
  • Город:Москва

Отправлено 31 Май 2006 - 20:54

"<" и ">=" это то, что написано - операторы сравнения, было бы странным опечататься 5 раз из 5...Разве здесь сказано про запрет операторов сравнения? (я понимаю задачу как, написать безбранчевый код (раз "и циклических" и подтверждают эту мысль и дальнейшие ответы)http://www.rsdn.ru/a...static_cast.xml

Во-первых, ?: был сочтен неподходящим.Во-вторых, стандарт, на который делался упор, не оговаривает результата операторов сравнения, делая упор только на то, что он нулевой или ненулевой (что-там говорилось то >> для unsigned)В-третьих, если исходить из формальной постановки, есть масса вещей, которые не являясь формальным нарушением условий, использовать не совсем честно: CMOV на P4, пропуск команды по условию, FABS, в конце-концов...
  • 0
Мир спасут красота и ковровые бомбардировки

#61 drv

drv

    Новичок

  • Новичок
  • Pip
  • 68 сообщений
  • 7 тем
  • Регистрация:12 Янв 2005

Отправлено 31 Май 2006 - 22:08

Нифига себе обсуждение :)Я бы сделал sort(@array) ака Perl - и фиг с ней с памятью, главное что работает, и еще модулей штук 30 со CPAN тамже цепляются. А таких вопросов

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

мне не задавали, не та наверно специфика :) Так что ИМХО, каждому свое :)
  • 0

#62 Ares

Ares

    Продвинутый

  • Новичок
  • PipPipPip
  • 187 сообщений
  • 12 тем
  • Регистрация:20 Май 2005

Отправлено 31 Май 2006 - 22:47

2 RittБлагодарю за ссылку и пояснения, но тем не менее полностью согласен с walenok.
  • 0
ЮРОДИВЫЙ

#63 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 31 Май 2006 - 23:17

Во-первых, ?: был сочтен неподходящим.

А при чем здесь оператор сравнения? Как раз из того что "?:" неподходящий и следует, что в задаче под запретом конструкция ветвления, а не операторы сравнения.

Во-вторых, стандарт, на который делался упор, не оговаривает результата операторов сравнения, делая упор только на то, что он нулевой или ненулевой (что-там говорилось то >> для unsigned)

Откуда такое заявление? Конкретно, где не по стандарту С++?(желательно с доказательством) Результат bool, далее неявное приведение типов (в варианте 3 static_cast). Приведенный мной код строго соответствует стандарту С++ и гарантирован им (неявное приведение типов и static_cast, так же оговоренно стандартом, как и, например, приоритеты операторов)

В-третьих, если исходить из формальной постановки, есть масса вещей, которые не являясь формальным нарушением условий, использовать не совсем честно: CMOV на P4, пропуск команды по условию, FABS, в конце-концов...

На мой взгляд, большинство в топике решает задачу на С++, поэтому и я решил присоединиться и ограничить решиние языком С++. Что именно вы видите некорректного в решении, учитывая ограничение - С++?

2 Rittтем не менее полностью согласен с walenok.

И теперь тоже?

Сообщение отредактировал RItt: 31 Май 2006 - 23:20

  • 0

#64 Ares

Ares

    Продвинутый

  • Новичок
  • PipPipPip
  • 187 сообщений
  • 12 тем
  • Регистрация:20 Май 2005

Отправлено 01 Июнь 2006 - 06:27

int t = a<b;При таком присваивании происходит сравнение a c b и в случае, если a<b в t должна заносится 1, в противном случае 0(однако, утверждать не берусь, но мне кажется, что там может оказаться(-1)). Фактически это частный случай (a<b) ? 1 : 0. А так код Ritt очень даже хороший.Единственное, что кстати относится ко всем нам. Согласитесь ведь не все знают какой либо конкретный язык программирования и всякие тонкости. Кто то знает PHP, кто то С++ и т.д. Поэтому алгоритм необходимо давать на русском, либо подробно комментировать свой код.

Сообщение отредактировал Ares: 01 Июнь 2006 - 07:16

  • 0
ЮРОДИВЫЙ

#65 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 01 Июнь 2006 - 10:43

Во-вторых, стандарт, на который делался упор, не оговаривает результата операторов сравнения, делая упор только на то, что он нулевой или ненулевой

int t = a<b;При таком присваивании происходит сравнение a c b и в случае, если a<b в t должна заносится 1, в противном случае 0(однако, утверждать не берусь, но мне кажется, что там может оказаться(-1)).

Откуда вы вообще предположения берете?

5.9.1The operands shall have arithmetic, enumeration or pointer type. The operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of the result is bool.3.9.1.6Values of type bool are either true or false.42) [Note: there are no signed, unsigned, short, or long bool types or values. ] As described below, bool values behave as integral types. Values of type bool participate in integral promotions (4.5).4.5.4An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true becoming one.4.7.4If the source type is bool, the value false is converted to zero and the value true is converted to one.

Фактически это частный случай (a<b) ? 1 : 0.

Какой частный случай? "?:" - это условный оператор, и это уже ветвтление!

Согласитесь ведь не все знают какой либо конкретный язык программирования и всякие тонкости. Кто то знает PHP, кто то С++ и т.д. Поэтому алгоритм необходимо давать на русском, либо подробно комментировать свой код.

Считаю, пока приводят код на С++, который на самом деле содержит ошибки и должен выполнять не то, что имел ввиду автор, допустимо комментировать и указывать на ошибки - возможно, кому-то это будет полезно.А так, видимо, я увожу от темы топика, и хочу сказать, что "без дополнительной памяти" - это значит, что оценка затраченой памяти на сортировку константа от числа элементов? Если да, то подходит любая сортировка методом вставок, что же имел ввиду автор топика?

Сообщение отредактировал RItt: 01 Июнь 2006 - 11:29

  • 0

#66 Ares

Ares

    Продвинутый

  • Новичок
  • PipPipPip
  • 187 сообщений
  • 12 тем
  • Регистрация:20 Май 2005

Отправлено 02 Июнь 2006 - 05:51

Единственный способ однозначно доказать или опровергнуть утверждение о идентичности t =(a<b) ? 1 : 0; и t = a<b; это создание 2 исполняемых файлов, с единственным различием. В исходниках одного t =(a<b) ? 1 : 0; в другом соответственно t = a<b; После создания экзешников и сравнения сразу будет видно прав я или нет. Можно также, вывести ассемблерный листинг. Почти уверен, что там будет, что то вроде:CMP EAX, 1JNZ M1……:M1а это и есть условный переход.К сожалению у меня в настоящее время не установлен ни один компилятор С++. Просто лень заморачиваться. Как ни будь на досуге, конечно сделаю такую проверку, но когда это будет – не знаю.
  • 0
ЮРОДИВЫЙ

#67 RItt

RItt

    Новичок

  • Новичок
  • Pip
  • 9 сообщений
  • 0 тем
  • Регистрация:14 Окт 2004

Отправлено 02 Июнь 2006 - 14:09

Единственный способ однозначно доказать или опровергнуть утверждение о идентичности t =(a<b) ? 1 : 0; и t = a<b; это создание 2 исполняемых файлов, с единственным различием. В исходниках одного t =(a<b) ? 1 : 0; в другом соответственно t = a<b; После создания экзешников и сравнения сразу будет видно прав я или нет. Можно также, вывести ассемблерный листинг. Почти уверен, что там будет, что то вроде:
CMP EAX, 1
JNZ M1


:M1
а это и есть условный переход.
К сожалению у меня в настоящее время не установлен ни один компилятор С++. Просто лень заморачиваться. Как ни будь на досуге, конечно сделаю такую проверку, но когда это будет – не знаю.

Повторять почему вы опять ошибаетесь я не буду - в предыдущих моих ответах все есть.
Самое интересное, что по вашему получится, если компилятор соптимизирует с С++ конструкцию ветвление или развернет цикл в код без переходов.
И последнее:
#include <iostream>unsigned int f0(int a, int b) {	return a<b;}unsigned int f1(int a, int b) {	return (a<b)? 1 : 0;}int main() {	int a, b;	std::cin >> a >> b;	return f0(a,b) != f1(a,b);}------------------------Компилятор GCC-4.0.3!!! с -O008048860 <_Z2f0ii>: 8048860:	55				   	push   %ebp 8048861:	89 e5					mov	%esp,%ebp 8048863:	8b 45 08			 	mov	0x8(%ebp),%eax!!! 8048866:	3b 45 0c			 	cmp	0xc(%ebp),%eax!!! 8048869:	0f 9c c0			 	setl   %al!!! 804886c:	0f b6 c0			 	movzbl %al,%eax 804886f:	5d				   	pop	%ebp 8048870:	c3				   	ret	08048872 <_Z2f1ii>: 8048872:	55				   	push   %ebp 8048873:	89 e5					mov	%esp,%ebp 8048875:	83 ec 04			 	sub	$0x4,%esp 8048878:	8b 45 08			 	mov	0x8(%ebp),%eax!!! 804887b:	3b 45 0c			 	cmp	0xc(%ebp),%eax!!! 804887e:	7d 09					jge	8048889 <_Z2f1ii+0x17>!!! 8048880:	c7 45 fc 01 00 00 00 	movl   $0x1,0xfffffffc(%ebp)!!! 8048887:	eb 07					jmp	8048890 <_Z2f1ii+0x1e>!!! 8048889:	c7 45 fc 00 00 00 00 	movl   $0x0,0xfffffffc(%ebp)!!! 8048890:	8b 45 fc			 	mov	0xfffffffc(%ebp),%eax 8048893:	c9				   	leave   8048894:	c3				   	ret	08048896 <main>: 8048896:	55				   	push   %ebp 8048897:	89 e5					mov	%esp,%ebp 8048899:	53				   	push   %ebx 804889a:	83 ec 24			 	sub	$0x24,%esp 804889d:	83 e4 f0			 	and	$0xfffffff0,%esp 80488a0:	b8 00 00 00 00	   	mov	$0x0,%eax 80488a5:	83 c0 0f			 	add	$0xf,%eax 80488a8:	83 c0 0f			 	add	$0xf,%eax 80488ab:	c1 e8 04			 	shr	$0x4,%eax 80488ae:	c1 e0 04			 	shl	$0x4,%eax 80488b1:	29 c4					sub	%eax,%esp 80488b3:	8d 45 f8			 	lea	0xfffffff8(%ebp),%eax 80488b6:	89 44 24 04			  mov	%eax,0x4(%esp,1) 80488ba:	c7 04 24 d8 9b 04 08 	movl   $0x8049bd8,(%esp,1) 80488c1:	e8 02 fe ff ff	   	call   80486c8 <_init+0x28> 80488c6:	89 c2					mov	%eax,%edx 80488c8:	8d 45 f4			 	lea	0xfffffff4(%ebp),%eax 80488cb:	89 44 24 04			  mov	%eax,0x4(%esp,1) 80488cf:	89 14 24			 	mov	%edx,(%esp,1) 80488d2:	e8 f1 fd ff ff	   	call   80486c8 <_init+0x28> 80488d7:	8b 45 f4			 	mov	0xfffffff4(%ebp),%eax 80488da:	8b 55 f8			 	mov	0xfffffff8(%ebp),%edx 80488dd:	89 44 24 04			  mov	%eax,0x4(%esp,1) 80488e1:	89 14 24			 	mov	%edx,(%esp,1) 80488e4:	e8 77 ff ff ff	   	call   8048860 <_Z2f0ii> 80488e9:	89 c3					mov	%eax,%ebx 80488eb:	8b 45 f4			 	mov	0xfffffff4(%ebp),%eax 80488ee:	8b 55 f8			 	mov	0xfffffff8(%ebp),%edx 80488f1:	89 44 24 04			  mov	%eax,0x4(%esp,1) 80488f5:	89 14 24			 	mov	%edx,(%esp,1) 80488f8:	e8 75 ff ff ff	   	call   8048872 <_Z2f1ii> 80488fd:	39 c3					cmp	%eax,%ebx 80488ff:	0f 95 c0			 	setne  %al 8048902:	0f b6 c0			 	movzbl %al,%eax 8048905:	8b 5d fc			 	mov	0xfffffffc(%ebp),%ebx 8048908:	c9				   	leave   8048909:	c3				   	ret	------------------------!!! с -O208048860 <_Z2f0ii>: 8048860:	55				   	push   %ebp 8048861:	89 e5					mov	%esp,%ebp 8048863:	8b 45 0c			 	mov	0xc(%ebp),%eax!!! 8048866:	39 45 08			 	cmp	%eax,0x8(%ebp)!!! 8048869:	5d				   	pop	%ebp!!! 804886a:	0f 9c c0			 	setl   %al!!! 804886d:	0f b6 c0			 	movzbl %al,%eax 8048870:	c3				   	ret	08048880 <_Z2f1ii>: 8048880:	55				   	push   %ebp 8048881:	89 e5					mov	%esp,%ebp 8048883:	8b 45 0c			 	mov	0xc(%ebp),%eax!!! 8048886:	39 45 08			 	cmp	%eax,0x8(%ebp)!!! 8048889:	5d				   	pop	%ebp!!! 804888a:	0f 9c c0			 	setl   %al!!! 804888d:	0f b6 c0			 	movzbl %al,%eax 8048890:	c3				   	ret	080488a0 <main>: 80488a0:	55				   	push   %ebp 80488a1:	89 e5					mov	%esp,%ebp 80488a3:	83 ec 28			 	sub	$0x28,%esp 80488a6:	83 e4 f0			 	and	$0xfffffff0,%esp 80488a9:	83 ec 10			 	sub	$0x10,%esp 80488ac:	8d 45 f0			 	lea	0xfffffff0(%ebp),%eax 80488af:	89 5d f4			 	mov	%ebx,0xfffffff4(%ebp) 80488b2:	89 75 f8			 	mov	%esi,0xfffffff8(%ebp) 80488b5:	89 7d fc			 	mov	%edi,0xfffffffc(%ebp) 80488b8:	89 44 24 04			  mov	%eax,0x4(%esp,1) 80488bc:	c7 04 24 98 9b 04 08 	movl   $0x8049b98,(%esp,1) 80488c3:	e8 00 fe ff ff	   	call   80486c8 <_init+0x28> 80488c8:	8d 55 ec			 	lea	0xffffffec(%ebp),%edx 80488cb:	89 54 24 04			  mov	%edx,0x4(%esp,1) 80488cf:	89 04 24			 	mov	%eax,(%esp,1) 80488d2:	e8 f1 fd ff ff	   	call   80486c8 <_init+0x28> 80488d7:	8b 5d ec			 	mov	0xffffffec(%ebp),%ebx 80488da:	8b 75 f0			 	mov	0xfffffff0(%ebp),%esi 80488dd:	89 5c 24 04			  mov	%ebx,0x4(%esp,1) 80488e1:	89 34 24			 	mov	%esi,(%esp,1) 80488e4:	e8 77 ff ff ff	   	call   8048860 <_Z2f0ii> 80488e9:	89 5c 24 04			  mov	%ebx,0x4(%esp,1) 80488ed:	89 34 24			 	mov	%esi,(%esp,1) 80488f0:	89 c7					mov	%eax,%edi 80488f2:	e8 89 ff ff ff	   	call   8048880 <_Z2f1ii> 80488f7:	8b 5d f4			 	mov	0xfffffff4(%ebp),%ebx 80488fa:	8b 75 f8			 	mov	0xfffffff8(%ebp),%esi 80488fd:	39 c7					cmp	%eax,%edi 80488ff:	8b 7d fc			 	mov	0xfffffffc(%ebp),%edi 8048902:	0f 95 c0			 	setne  %al 8048905:	89 ec					mov	%ebp,%esp 8048907:	5d				   	pop	%ebp 8048908:	0f b6 c0			 	movzbl %al,%eax 804890b:	c3				   	ret

Сообщение отредактировал RItt: 02 Июнь 2006 - 14:18

  • 0

#68 Ares

Ares

    Продвинутый

  • Новичок
  • PipPipPip
  • 187 сообщений
  • 12 тем
  • Регистрация:20 Май 2005

Отправлено 03 Июнь 2006 - 09:25

Приведенный ассемблерный листинг как раз таки доказывает, что t = a<b; и есть условный переход. Но он также, надо признать, доказывает, что в t будет только 0 или 1.В первой же функции (08048860 <_Z2f0ii>: ), есть команда SET!!! 8048869: 0f 9c c0 setl %alВот описание этой команды (взято из справочника по ассемблеру):

SETcc(byte SET on condition)Установка байта по условию Назначение: установка операнда логическим значением в зависимости от истинности условия, заданного модификатором кода операции cc. Синтаксис Алгоритм работы: Команда проверяет истинность условия, заданного в коде операции, то есть, фактически, состояние определенных флагов. Если проверяемое условие (или содержимое соответствующих флагов на момент выдачи команды setcc) истинно, то установить значение операнда в 01h, если условие ложно — то в 00h. Применение: Эти команды можно использовать после любой команды, изменяющей флаги, при необходимости анализа результата изменений. Если проанализировать условия для команд условного перехода, то обнаружится их полное соответствие с условиями, обрабатываемыми командой setcc, за исключением, конечно, команд jcxz и jecxz. е определенных флагов.

А, то, что при оптимизации получились две одинаковые функции((!!! с -O2) 08048860 <_Z2f0ii>: и 08048880 <_Z2f1ii>: ) - лишнее подтверждение Того, что t = a<b; - частный случай t =(a<b) ? 1 : 0;

Сообщение отредактировал Ares: 03 Июнь 2006 - 11:18

  • 0
ЮРОДИВЫЙ




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных