2015-08-27 29 views
6

Merhaba bu kodu dikkate için mantıklı değil:bu C kodunun bazı bölümleri beni

uint16_t dest_pid; 
uint8_t *p; 

pf->dest_pid = p[0] + (p[1] << 8) //(p[1] << 8) equals 0 right? 

Bu kod gömülü işletim sisteminin sürücünün bir parçasıdır. Bazı fikirler bu ifadenin arkasındaki fikir olabilir? Yoksa önemli bir şey eksik olabilir miyim?

+0

Dereferencing başlatılmamış işaretçi ?? Fikrin ne olduğundan emin değil ama emin olmak için iyi bir fikir değil. Bazı kodları kaçırmadıkça? – mathematician1975

+1

'(p [1] << 8)' bir ifadedir. * [*] Türünden * türetilmiş bir tür (işaretsiz) vardır: sadece imzasız kaliteyi değil, kaliteyi değil “mirasını” alır. – joop

+0

Buradan bakın: http://stackoverflow.com/questions/12131568/bit-shifting-a-byte-by-more-than-8-bit – Downvoter

cevap

4

İlk: pf sonra dest_pid yapıdan parçasıdır ve bunun ardından uint16_t dest_pid;

İkinci bir başka değişken olduğunu düşünüyorum: puint8_t bir göstericidir sen (p[1] << 8) yaptığınızda için, 8 tarafından pointer içinde ne olduğunu vardiya Örnek p[1] = 0xE5 değiştirdikten sonra 0xE500 olacaktır. Sonucunuzu 2 bayt değişken olan dest_pid içine koyduğunuzu unutmayın. o değil mi neden

son satırın çeviri pid düşük byte (daha az önemli) almak ve pid ait (8 tarafından kaydırılır) yüksek byte eklemek ve pf->dest_pid koymak büyük olasılıkla

, düşündüğünüzden Başlangıçtan 2 bayt gönderiyoruz ve bunun sebebi, onu, bir birim zaman birimi başına (döngü) gönderen bir veriyolundan almasıdır.

8

p ürününüzün anlamlı bir şekilde başlatıldığını varsayalım (bazı geçerli konumlara işaret etmek için).

Sonra p[0] + (p[1] << 8) yılında p[1] örtülü sol shift << 8 yapmadan önce unsigned terfi olacağını, bu nedenle kodu (örn ARM gibi 32 bit işlemcilerde) mantıklı. Gayri bu saçın alt 8 bit p[0] gelen ve p[1]

fena halde konuşma daha yüksek 8 bit olduğu bir 16-bit gerçekleştirirse, örtülü kural C aritmetik işlemler en az (ve hiç veri küçük parçalara int üzerinde olmasıdır short veya uint8_t veya char gibi). Ancak detaylar daha karmaşıktır (ve C89'dan C99'a ve C11 standartlarına göre biraz değişmiştir).

+4

"uint8_t" türünde, "p [1]" ifadesi, _integer promotions_ nedeniyle dolaylı olarak int (veya isterseniz "işaretli") olacaktı. Bu durumda başka bir yolu yoktur. –

+0

Bu doğru, ancak p [türünde ne varsa] tipi sekiz bittir. Açıkça ".. + (uint16_t) (p [1] << 8) olarak yayınlandıysa" Anlayacağım, p [1] * 256'ya eşit olacaktır. Şimdilik sadece bunu görüyorum "(eight_bit_var < <8) "(benim için) sıfır anlamına gelir. –

+0

@RadoslawKrasimirow: yanılıyorsunuz: (sekizbitvar << 8), 8 bitlik bir işlenen vardiya değil, bir “int” kaymasıdır. Yani her zaman sıfır değildir. –

İlgili konular