29 Nisan 2020 Çarşamba

Integer Promotion

Giriş
Bit işlemlerinde sayılar Integer Promotion işlemine uğrayabilir.

Bit Negate
Örnek
Elimizde şöyle bir kod olsun. i değişkeni bit negate işlemine uğradığı için uint8_t tipi uint32_t tipine promote ediliyor.
uint8_t i = 0;
int sz;

sz = sizeof(i);
printf("Size of variable: %d\n", sz); // Size of variable: 1

sz = sizeof(~i);
printf("Size of result: %d\n", sz); // Size of result: 4
Bit Shifting
Açıklaması şöyle
The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.
Örnek
Şöyle yaparız.
unsigned char a;
a=0x56;
printf("%x",a<<2);  //Çıktı 0x158
char önce int'e çevrilir ve elimize şu geçer
0000 0000 0101 0110
İki defa kaydırınca elimize şu geçer
0000 0001 0101 1000
Örnek
Integer promotion'dan dolayı sonucu mask'lamak gerekir.
Elimizde şöyle bir kod olsun.
 uint8_t port = 0x5a;
Şöyle yaparızport ile sonuç integer'a çevrilir ve elimize 0x0000005a geçer. Tersini alınca elmizde 0xffffffa5 geçer. Mask'layarak 0xa5 kısmını alırız ve 4 defa kaydırınca 0x05 kalır. Eğer mask'lamazsak a'nın solundaki 0xF'te kaydırmada sayıya dahil olacağı için sonuc değiştirir. 0x05 yerine 0xF5 alırız.
uint8_t result_8 =  (~port & 0xff) >> 4;

Hiç yorum yok:

Yorum Gönder