Pretypovani ukazatele struktury na bajt

Hynek Sladky econf na centrum.cz
Úterý Únor 25 15:10:45 CET 2020


Nevim, ale tipnul bych si, ze hodnota sizeof(0xADDE) bude uz 4 misto 2, 
a pak by znamenko nebude nastavene...
Pokud je int pro hodnoty -32786 az +32767, tak 0xADDE uz je vetsi a bude 
to automaticky 32-bitova hodnota...?

Hynek Sladky


Dne 25.2.2020 v 15:01 David Obdrzalek napsal(a):
> 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