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

Jun 19, 2007 31 Replies

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

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"

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



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

Привет 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

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

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

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

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

Привет 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

Привет Alexander!

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

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

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

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

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

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

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

Шн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, но я такого не видел слава Иегове.

Майкл

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

Привет 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] Алексей М. ... Смотрю куда глаза глядят...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required