Я глючу, или компиляор ?

Hello Alexander.

19 Jun 07 22:11, Alexander Torres wrote to Yuriy K:

AT>>> ------ unsigned char A, B, C, D; //................ AT>>> A=0x0F; AT>>> B=0xF0;

AT>>> C=~B;

AT>>> if ( A= = C) D=1; else D=0; - // работает как положено, т.е AT>>> Д=1. AT>>> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0. AT>>> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

YK>> if ( A == (unsigned char)(~B) ) { D=1; } YK>> else { D=0; }

AT> Так работает, спасибо.

YK>> Recommended literature: C89 standard, C99 standard, MISRA C.

AT> Да я понимаю, что по стандарту положено все в инт переводить, но AT> учитывая что компилятор для 8-биток, и оба операнда - байты, я ожидал AT> более умного поведения.

Hу, можно еще написать:

D = !((A^B)+1);

Что должно работать для типов любой длины, но это уже извращение :)

Dmitry

Reply to
Dmitry Lyokhin
Loading thread data ...

Tue Jun 19 2007 21:15, Alexander Torres wrote to All:

AT> Hужна помощь клуба, это или я позавчера ночью наглючил, или у компилятора AT> глюк?

AT> //--------------------------------------------------------------------- AT> unsigned char A, B, C, D; AT> //................

AT> A=0x0F; AT> B=0xF0;

AT> C=~B;

AT> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1.

AT> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

AT> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

Try

if ( A == (unsigned char)(~B) ) { D=1; } else { D=0; }

C99: ===

6.5.3.3 Unary arithmetic operators: ... (4) The result of the ~ operator is the bitwise complement of its (promoted) operand (that is, each bit in the result is set if and only if the corresponding bit in the converted operand is not set).

If the promoted type is an unsigned type, the expression ~E is equivalent to the maximum value representable in that type minus E. ===

Recommended literature: C89 standard, C99 standard, MISRA C.

:)

"Liberalism is a mental disorder"

Reply to
Yuriy K

Hello, All!

Нужна помощь клуба, это или я позавчера ночью наглючил, или у компилятора глюк?

//--------------------------------------------------------------------- unsigned char A, B, C, D; //................

A=0x0F; B=0xF0;

C=~B;

if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1.

if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает //-----------------------------------------------------------------------------

Компилятор - Hi-Тech 8.02PL1

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Hello, Alexander! You wrote to All on Tue, 19 Jun 2007 16:15:49 +0000 (UTC):

AT> Нужна помощь клуба, это или я позавчера ночью наглючил, или у AT> компилятора глюк?

AT> //--------------------------------------------------------------------- AT> unsigned char A, B, C, D; AT> //................

AT> A=0x0F; AT> B=0xF0; AT> C=~B; AT> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1. AT> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

Ессно. 0x000F не равно 0xFF0F. А ты что хотел?

AT> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

И не должно. Впрочем, если в компилере есть опция отключающая integer promotion, то работать будет.

AT> //---------------------------------------------------------------------

AT> Компилятор - Hi-Тech 8.02PL1

Пофиг.

WBR, AVB

Reply to
Alexey V Bugrov

Привет Alexander!

19 Июн 07 года (а было тогда 20:15) Alexander Torres в своем письме к All писал:

AT> Hужна помощь клуба, это или я позавчера ночью наглючил, или у AT> компилятора глюк? AT> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0. AT> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

Если вот так, то все работает : if (A == (unsigned char)~B ) D=1; else D=0; if (A == (unsigned char)(~B) ) D=1; else D=0; Если вместо char int применить (значения соответственно 0x00FF и 0xFF00), то тоже все работает. Видимо по стандарту все правильно компиллер делает.

AT> Компилятор - Hi-Тech 8.02PL1

Я пробовал РIСС 9.60, со включеной оптимизацией, если переменные не volatile код вырождается в CLRF D; INCF D,F;

С уважением, Andrey 19 Июн 07 года

formatting link
E-Mail:a_biv<саба>list,ru Jabber:Andrey_B@jabber,ru |СQ:226793191

Reply to
Andrey Bivshih

Hello, Alexey! You wrote to Alexander Torres on Tue, 19 Jun 2007 17:15:16 +0000 (UTC):

AV> Hello, Alexander! AV> You wrote to All on Tue, 19 Jun 2007 16:15:49 +0000 (UTC):

AT>> Нужна помощь клуба, это или я позавчера ночью наглючил, или у AT>> компилятора глюк?

AT>> //-------------------------------------------------------------------- AT>> unsigned char A, B, C, D; AT>> //................

AT>> A=0x0F; AT>> B=0xF0; AT>> C=~B; AT>> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1. AT>> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

AV> Ессно. 0x000F не равно 0xFF0F. А ты что хотел?

Т.е. что компилятор для 8-биток, при сранлении двух байтов переводит их в инт ?! Никогда бы не подумал.

AT>> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

AV> И не должно. Впрочем, если в компилере есть опция отключающая integer AV> promotion, то работать будет.

AT>> //--------------------------------------------------------------------

AT>> Компилятор - Hi-Тech 8.02PL1

AV> Пофиг.

Ну все же, он для 8-биток, мог бы быть и поумнее.... AV> WBR, AV> AVB

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Hello, Yuriy! You wrote to Alexander Torres on Tue, 19 Jun 2007 20:12:30 +0400:

YK> Tue Jun 19 2007 21:15, Alexander Torres wrote to All:

AT>> Hужна помощь клуба, это или я позавчера ночью наглючил, или у AT>> компилятора глюк?

AT>> //-------------------------------------------------------------------- AT>> unsigned char A, B, C, D; AT>> //................

AT>> A=0x0F; AT>> B=0xF0;

AT>> C=~B;

AT>> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1.

AT>> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

AT>> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

YK> Try

YK> if ( A == (unsigned char)(~B) ) { D=1; } YK> else { D=0; }

Так работает, спасибо.

YK> Recommended literature: C89 standard, C99 standard, MISRA C.

Да я понимаю, что по стандарту положено все в инт переводить, но учитывая что компилятор для 8-биток, и оба операнда - байты, я ожидал более умного поведения.

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Hello, Alexander! You wrote to Alexey V Bugrov on Tue, 19 Jun 2007 18:06:59 +0000 (UTC):

AV>> Ессно. 0x000F не равно 0xFF0F. А ты что хотел?

AT> Т.е. что компилятор для 8-биток, при сранлении двух байтов переводит их AT> в инт ?! AT> Никогда бы не подумал.

Ну покопайся в опциях, может отключабельно. Я просто хайтеком никогда не пользовался. mcc18 такую опцию имеет, причем по умолчанию включенную. Не факт, что это правильно, чей-нибудь код может расчитывать на стандартное поведение.

WBR, AVB

Reply to
Alexey V Bugrov

Hello, Alex! You wrote to Alexander Torres on Wed, 20 Jun 2007 01:13:49 +0400:

AT>> Hу все же, он для 8-биток, мог бы быть и поумнее....

AM> Только если у него sizeof(int) равен единице. Hо такое я видел AM> только в одном из первых SDCC. Тип инт, не способный представить AM> значение больше 127 - знатное извращение! :)))

Вроде бы стандарт явно запрещает int меньше 16 бит.

WBR, AVB

Reply to
Alexey V Bugrov

Привет Alexander!

19 Jun 07 20:15, Alexander Torres писал All:

AT> - unsigned char A, B, C, D; //................

AT> A=0x0F; AT> B=0xF0;

AT> C=~B;

// Я так понимаю, "= =" следует читать как "=="? :)

AT> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1.

AT> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

// Работает. D и должно быть 0, т.к. ~B равно // либо 0xffffff0f, либо 0xff0f в зависимости от sizeof(int), // но никак не A.

AT> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

// А это ничем не отличается от предыдущего случая, // так как оператор ~ и так имеет более высокий приоритет, // чем оператор ==.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Совет дня: чтобы убить жирную лошадь, добавьте к капле никотина каплю fairy

Reply to
Alex Mogilnikov

Привет Alexander!

19 Jun 07 22:06, Alexander Torres писал Alexey V Bugrov:

AT> Hу все же, он для 8-биток, мог бы быть и поумнее....

Только если у него sizeof(int) равен единице. Hо такое я видел только в одном из первых SDCC. Тип инт, не способный представить значение больше 127 - знатное извращение! :)))

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В главной роли - Сильвестр с талоном.

Reply to
Alex Mogilnikov

Hello, Dmitry! You wrote to Alexander Torres on Tue, 19 Jun 2007 19:51:57 +0400:

AT>> Да я понимаю, что по стандарту положено все в инт переводить, но AT>> учитывая что компилятор для 8-биток, и оба операнда - байты, я ожидал AT>> более умного поведения.

DL> Hу, можно еще написать:

DL> D = !((A^B)+1);

DL> Что должно работать для типов любой длины, но это уже извращение :)

Естественно :)

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Hello, Andrey! You wrote to Alexander Torres on Tue, 19 Jun 2007 21:38:44 +0400:

AT>> Компилятор - Hi-Тech 8.02PL1

AB> Я пробовал РIСС 9.60, со включеной оптимизацией, если переменные не AB> volatile код вырождается в CLRF D; INCF D,F;

Ну это наверное, потому что константы (поскольку это был пример). Были бы нормальные переменные - все же условие бы проверялось :) Я смотрел во что оно компилируется - там в самом деле были 16-битные вычисления.

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Hello, Alex! You wrote to Alexander Torres on Wed, 20 Jun 2007 01:07:00 +0400:

AM> Привет Alexander!

AM> 19 Jun 07 20:15, Alexander Torres писал All:

AT>> - unsigned char A, B, C, D; //................

AT>> A=0x0F; AT>> B=0xF0;

AT>> C=~B;

AM> // Я так понимаю, "= =" следует читать как "=="? :)

Конечно, просто у меня в Фидолуке два = подряд сливаются, поэтому я пробел между ними воткнул. Не думал что у кого-то возникнут вопросы по этому поводу :)

AT>> if ( A= = C) D=1; else D=0; - // работает как положено, т.е Д=1.

AT>> if ( A= = ~B ) D=1; else D=0; // - не работает, Д всегда 0.

AM> // Работает. D и должно быть 0, т.к. ~B равно AM> // либо 0xffffff0f, либо 0xff0f в зависимости от sizeof(int), AM> // но никак не A.

AT>> if ( A= = (~B) ) D=1; else D=0 // - аналогично. не работает

AM> // А это ничем не отличается от предыдущего случая, AM> // так как оператор ~ и так имеет более высокий приоритет, AM> // чем оператор ==.

Конечно, просто это была попытка проверить.

With best regards, Alexander Torres. 2:461/28, E-mail: snipped-for-privacy@yahoo.com [а ночью мы снова, уйдем эскадроном..]

formatting link

Reply to
Alexander Torres

Шнyp жи%, Alex. Сpеда Июнь 20 2007 02:13, Alex Mogilnikov wrote to Alexander Torres:

AT>> Hy все же, он для 8-биток, мог бы быть и поyмнее.... AM> Только если y него sizeof(int) pавен единице. Hо такое я видел AM> только в одном из пеpвых SDCC. Тип инт, не способный пpедставить AM> значение больше 127 - знатное извpащение! :)))

Вещи слабо связанные. У стаpых only-16bit DSP int == char == int16, y 32bit DSP еще веселее: char == int32. В обоих слyчаях sizeof(int) == 1. У однокpисталлок теоpетически может быть int == int8, но я такого не видел слава Иегове.

Майкл

Reply to
Michael Mamaev

Hello, Michael! You wrote to Alex Mogilnikov on Wed, 27 Jun 2007 22:04:52 +0400:

MM> У однокpисталлок теоpетически может быть int == int8, но я такого не MM> видел слава Иегове.

Насколько я знаю в стандартном С такого быть не может. int обязан уметь представлять числа как минимум от -32768 до 32767.

WBR, AVB

Reply to
Alexey V Bugrov

Привет Michael!

27 Jun 07 23:04, Michael Mamaev писал Alex Mogilnikov:

AM>> Только если y него sizeof(int) pавен единице. Hо такое я AM>> видел только в одном из пеpвых SDCC. Тип инт, не способный AM>> пpедставить значение больше 127 - знатное извpащение! :)))

MM> Вещи слабо связанные. У стаpых only-16bit DSP int == char == int16, y MM> 32bit DSP еще веселее: char == int32. В обоих слyчаях sizeof(int) == MM> 1.

Уточняю: char и int там были размером 8 бит, а short - 16 бит (!).

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Смотрю куда глаза глядят...

Reply to
Alex Mogilnikov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.