undefined???
От: WolfHound  
Дата: 21.02.03 14:01
Оценка:
int x=0x12345678;
char* c=(char*)&x;
x=c[0]<<24+c[1]<<16+c[2]<<8+c[3];

x==0!!!!!!!!!
А если так то что и ожидалось
x=c[0]<<24|c[1]<<16|c[2]<<8|c[3];

x==0x78563412
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: undefined???
От: Lexey Россия  
Дата: 21.02.03 14:03
Оценка: 4 (1)
Здравствуйте, WolfHound, Вы писали:

WH>
WH>int x=0x12345678;
WH>char* c=(char*)&x;
WH>x=c[0]<<24+c[1]<<16+c[2]<<8+c[3];
WH>

WH>x==0!!!!!!!!!
WH>А если так то что и ожидалось

Плохо ожидалось. Приоритет + выше, чем <<.
"Будь достоин победы" (c) 8th Wizard's rule.
Re: undefined???
От: Bell Россия  
Дата: 21.02.03 14:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>
WH>int x=0x12345678;
WH>char* c=(char*)&x;
WH>x=c[0]<<24+c[1]<<16+c[2]<<8+c[3];
WH>

WH>x==0!!!!!!!!!
WH>А если так то что и ожидалось
WH>
WH>x=c[0]<<24|c[1]<<16|c[2]<<8|c[3];
WH>

WH>x==0x78563412
WH>

5.8.1:
...
The behavior is undefined if the right operand is negative, or greater than or equal 
to the length in bits of the promoted left operand.


В данном случае операнды имеют тип char, длина которого в битах 8, т.е. все присутствующие в данных выражениях сдвиги ведут к undefined behavior, что впрочем подтверждается результатом.
Любите книгу — источник знаний (с) М.Горький
Re: undefined???
От: _nn_ www.nemerleweb.com
Дата: 22.02.03 12:14
Оценка:
Здравствуйте, WolfHound

Просто нужно поставить скобки.

int x=0x12345678;
char* c=(char*)&x;
x=(c[0]<<24)+(c[1]<<16)+(c[2]<<8)+c[3];
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: undefined???
От: Андрей Тарасевич Беларусь  
Дата: 22.02.03 16:05
Оценка: 7 (1)
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, WolfHound, Вы писали:


WH>>
WH>>int x=0x12345678;
WH>>char* c=(char*)&x;
WH>>x=c[0]<<24+c[1]<<16+c[2]<<8+c[3];
WH>>

WH>>x==0!!!!!!!!!
WH>>А если так то что и ожидалось
WH>>
WH>>x=c[0]<<24|c[1]<<16|c[2]<<8|c[3];
WH>>

WH>>x==0x78563412
WH>>

B>5.8.1:

B>
B>...
B>The behavior is undefined if the right operand is negative, or greater than or equal 
B>to the length in bits of the promoted left operand.
B>


B>В данном случае операнды имеют тип char, длина которого в битах 8, т.е. все присутствующие в данных выражениях сдвиги ведут к undefined behavior, что впрочем подтверждается результатом.


Сам прочитай приведенную тобою же цитату. Речь идет о promoted left operand. Promoted operand в данном случае будет иметь тип 'int'.
Best regards,
Андрей Тарасевич
Re[2]: undefined???
От: WolfHound  
Дата: 22.02.03 16:50
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Плохо ожидалось. Приоритет + выше, чем <<.

... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: undefined???
От: Bell Россия  
Дата: 24.02.03 08:17
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Сам прочитай приведенную тобою же цитату. Речь идет о promoted left operand. Promoted operand в данном случае будет иметь тип 'int'.


Да уж...
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.