Pretypovani ukazatele struktury na bajt
David Obdrzalek
David.Obdrzalek na mff.cuni.cz
Úterý Únor 25 15:01:12 CET 2020
Ale proč to funguje s 0xADDE, které má taky nejvyšší bít nahozený?
D.O.
On 25 Feb 2020 at 13:58, Hynek Sladky wrote:
> To vypada na znamenko...
> 0xAD << 8 je 16-bitovy int se zapornou hodnotou
> Pak se to implicitne pretypuje na uint32_t (podle dalsich clenu), ale
> protoze to je zaporna hodnota, tak se znamenko expanduje do vyssich bytu
> jako 0xFFFF0000.
>
> Mohlo by pomoct zapisovat konstanty s priponou u, tedy napr. 0xADu << 8
>
> Hynek Sladky
>
>
> Dne 25.2.2020 v 13:28 David Obdrzalek napsal(a):
> > ALE když odmažu přetypování prvních dvou bytů, tak tam vyjde:
> > hdr.ident = 0xDE | 0xAD << 8 | ((uint32_t)0xBE) << 16 | ((uint32_t)0xEF) << 24;
> > 4c6: 8e ed ldi r24, 0xDE ; 222
> > 4c8: 9d ea ldi r25, 0xAD ; 173
> > 4ca: af ef ldi r26, 0xFF ; 255
> > 4cc: bf ef ldi r27, 0xFF ; 255
> > 4ce: 80 93 b1 01 sts 0x01B1, r24 ; 0x8001b1 <hdr+0x2>
> > 4d2: 90 93 b2 01 sts 0x01B2, r25 ; 0x8001b2 <hdr+0x3>
> > 4d6: a0 93 b3 01 sts 0x01B3, r26 ; 0x8001b3 <hdr+0x4>
> > 4da: b0 93 b4 01 sts 0x01B4, r27 ; 0x8001b4 <hdr+0x5>
> >
> > Vůbec nachápu, proč ty dvě FF ??
> >
> > hdr je deklarované takhle:
> > typedef struct {
> > uint16_t magic;
> > uint32_t ident;
> > } _hdr;
> > _hdr hdr;
> >
> > Překladač avr-gcc (GCC) 5.4.0 na Win.
> >
> >
> > Jo tak teď jsem ještě zmatenější, protože mě napadlo zkusit:
> > hdr.ident = 0xADDE | ((uint32_t)0xBE) << 16 | ((uint32_t)0xEF) << 24;
> > 4c6: 8e ed ldi r24, 0xDE ; 222
> > 4c8: 9d ea ldi r25, 0xAD ; 173
> > 4ca: ae eb ldi r26, 0xBE ; 190
> > 4cc: bf ee ldi r27, 0xEF ; 239
> > 4ce: 80 93 b1 01 sts 0x01B1, r24 ; 0x8001b1 <hdr+0x2>
> > 4d2: 90 93 b2 01 sts 0x01B2, r25 ; 0x8001b2 <hdr+0x3>
> > 4d6: a0 93 b3 01 sts 0x01B3, r26 ; 0x8001b3 <hdr+0x4>
> > 4da: b0 93 b4 01 sts 0x01B4, r27 ; 0x8001b4 <hdr+0x5>
> >
> > a tohle prošlo jak bych původně čekal!
Další informace o konferenci Hw-list