C nin kadim ustalarına esrarlı bir soru 2

Başlatan zengdai, 11 Temmuz 2014, 01:37:09

zengdai

Merhaba arkadaşlar,
Değişken tipi çevrimlerinde sürekli problem yaşıyorum. Yaptığım matamatiksel hesaplamalarda hatalı sonuçlar alıyorum.CCS nin reference manual inde (sayfa 279) bir miktar ingilizce açıklama yapmış ama tam anlayamadım.
Bu konuda bilgisi olanlar tecrübelerini paylaşabilirse çok sevinirim. Bunun kuralları neler öğrenmek istiyorum.
Örnek olarak veriyim data sheet den;

A common C programming error is to do something like:
i16 = i8 * 100;
When the intent was:
i16 = (long) i8 * 100;

Gökhan BEKEN

Hocam, c bilmeden mcu kodlamaya çalıştığınızdan kaynaklanıyor. Hangi işlemde yanlış sonuç aldığınızı yazarsanız, çözüme daha çabuk ulaşabilirsiniz.
http://www.tutorialspoint.com/cprogramming/c_type_casting.htm
türkçe bilgi: http://www.kadifeli.com/fedon/stdcprtr.php?1_6
Özel mesaj okumuyorum, lütfen göndermeyin.

quarko

İki 8 bit sayıyı çarptığında sonuç maksimum 16 bit çıkar. İki 16 bit sayıyı çarptığında sonuç maksimum 32 bit çıkar. Bu nedenle işlemlerin sonucunu uygun türde değişkenlere atmalısın.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

mufitsozen

Alıntı yapılan: zengdai - 11 Temmuz 2014, 01:37:09
Merhaba arkadaşlar,
Değişken tipi çevrimlerinde sürekli problem yaşıyorum. Yaptığım matamatiksel hesaplamalarda hatalı sonuçlar alıyorum.CCS nin reference manual inde (sayfa 279) bir miktar ingilizce açıklama yapmış ama tam anlayamadım.
Bu konuda bilgisi olanlar tecrübelerini paylaşabilirse çok sevinirim. Bunun kuralları neler öğrenmek istiyorum.
Örnek olarak veriyim data sheet den;

A common C programming error is to do something like:
i16 = i8 * 100;
When the intent was:
i16 = (long) i8 * 100;

once siz sorunuzdaki
Alıntı Yapi16 = i8 * 100;
When the intent was:
i16 = (long) i8 * 100;

satirlarindan ne anladiniz onu soyleyin bizde size aciklama yapalim.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

MrDarK

Veya daha kolayı amaç nedir ne yapılmaya çalışıyor ? Ona göre yönlendirelim hep beraber
Picproje Eğitim Gönüllüleri ~ MrDarK

LukeSkywalker

Kaan Aslan A'dan Z'ye C klavuzu kitabının tür dönüşümleri kısmını inceleyiniz.

t2

Kadim ustası değilseniz, o yüzden gelmemiştir

LukeSkywalker


bocek

Alıntı yapılan: t2 - 11 Temmuz 2014, 14:55:31
Kadim ustası değilseniz, o yüzden gelmemiştir
ben de diyorum niye kafa yapmadı :D
1 ya da 0. işte 'bit'ün mesele..

aliveli

yani diyor ki 8 bitlik bir sayıyı (en fazla 255 olan) bir sayıyla çarptığında sonuç 255'i geçemez(overflow). sonucu eşitlediğin sayının 16 bit olması bunu değiştirmez.
20*100=2000 olmaz yani.
çarpım sonucu 255'i geçecekse değişkenini 16 bitlik olana yükseltmelisin ve bunu çarpmadan önce kendin yapmalısın ( (long) i8  gibi)
iki tane 8 biti çarpınca 16 bit olmaz

LukeSkywalker

Peki o zaman ben bir soru sorayım.
int a;
char b=200,c=30;

void main()
{
 a=b*c;
}


işleminin sonucunda a'nın değeri ne olur?

LukeSkywalker

ANSI C'de sonucun kaç olması lazım? 
6000 mi ,112 mi?

mir_as82


LukeSkywalker

Emin misiniz?
Hangi derleyiciyi kullanıyorsunuz?

sseedat

int 4 byte olarak ele alınırsa;

char eğer derleyici tarafından signed olarak işleme sokluyorsa b değişkeni sınırları aştığından negatif bir değer alır.sonuç=-1680

char unsigned olarak işleme sokuluyorsa normal çarpım yapılıp geçilir:sonuç=6000

Görünmez bir mezarlıktır Zaman...