C nin kadim ustalarına esrarlı bir soru 2

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

LukeSkywalker

#15
int 2 byte ise?

mesaj birleştirme:: 11 Temmuz 2014, 22:07:15

http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/04/int1e.html
Example 2'ye dikkat.
Tür dönüşümlerinde sık karşılaşılan hatalardan birisidir bu.

sseedat

int 2 byte ise sonuçar yine aynı int değerinde taşma olmuyor.

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

volkii

CCS'te benimde başıma geldi bu. İşin özeti:

iki 8 bitlik değişkeni çarparsan, sonucu atadığın değişken 16bit bile olsa sonucun 8 bitlik bir değer çıkıyor.
ancak bu  8 bitlik değişkenleri 16bite çevirip çarparsan, sonucu o zaman 16bit görebilirsin

LukeSkywalker

ANSI  C standartlarına göre  aritmetik işlemler yaparken en küçük tür int olmak zorundadır. Bu sebeple eğer derleyiciniz ANSI C uyumlu ise char veya short tipinde iki değişken birbiri ile aritmetik bir işleme tabi tutulduğunda ilk olarak integer'a dönüştürülürler. Benim yukarıda sorduğum soruda verdiğim örnekte sonuç int tipinde bir değişkene aktarıldığı için veri kaybı söz konusu değildir.  (Bakınız: integer promotion, arithmetic conversion)
http://www.idryman.org/blog/2012/11/21/integer-promotion/
http://www.eskimo.com/~scs/cclass/int/sx4cb.html

mir_as82

Onceden yanliş yazmisim. Hocam sorunun cevabi 6000.
Çünkü sonuç 0x1770 dir
Bu değer 2 byte içindedir ve son bit 0 dir pozitiftir.

z

#20
char muglak bir degisken tipi. Isaretli de olabilir isaretsiz de. Bu derleyiciye gore degisir.

Bu belirsizlik ortadan kaldirilmadigi surece bu soruya nasil kafa yoracagiz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

LukeSkywalker


z

C yi bilmiyorum ki ANSI sini bileyim.

ANSI C, char icin ne diyor?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mir_as82

Hocam char önemli değil bu soruda. Ansi c de int alti değişken türleri işlem yapilacagi zaman int e dönüştürülüp işlem yapilir. Yani çarpmaya girmeden o değişkenler int 200 ve int 20 olur. O zaman sonuç 6000 olur.

z

#24
Olurmu?

isaret durumu ve boyutu belirsiz bir degiskene 200 yuklemek  aldatici bir durumdur.

Mesela 16 bitlik bir degiskene  65535 yukle dersem  degiskendeki verinin anlami  -1 de olabilir +65535 de olabilir.

Bu belirsizligi yok etmenin tek yolu degiskenin signed yada unsigned olusunu tanimlamaktan gecer.

(Eger char denen degisken 8 bit degil de 16 bit ise bu durumda degiskene 200 degeri yuklemede sorun yok. Fakat charin 16 bit tanimlanacagini hic sanmiyorum)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

LukeSkywalker

#25
Z doğru söylüyor. İşaretli işaretsiz olup olmayacağını derleyici belirliyor. Fakat ben sorumdan sonra sonucun 112 mi veya 6000'mi olacağını tekrar sorarak aslında unsigned char olacağını belli etmiştim. Ama burada asıl önemli olan otomatik tür dönüşümüne dikkat çekmek.
CCS C'de bunu deneyebilecek olan var mı? MikroC'de sonuç 6000.

mir_as82

Evet haklisiniz. Ama burada char signed veya unsigned olup olmadigina bakmamiz gerek. Visual  c++ da char  signed char dir.

LukeSkywalker

Alıntı yapılan: mir_as82 - 12 Temmuz 2014, 16:25:47
Evet haklisiniz. Ama burada char signed veya unsigned olup olmadigina bakmamiz gerek. Visual  c++ da char  signed char dir.
Visual c++'yı bilmiyorum. ANSI C'ye göre char değişkeninin donanıma signed mı yoksa unsigned mı olacağı belirtilmeli. Bunu da derleyici yazanlar kafalarına göre belirlemişler. Eğer değişkenin işaretli mi işaretsiz mi olduğunu belirtmiyorsanız bunu derleyici ne olarak kabul ediyor o önem kazanıyor.

Tabi sorunun buradaki amacı integer promotion'dan haberdar olmayan arkadaşları haberdar etmek. Genelde PIC derleyicilerinde char unsigned olarak kabul ediliyor.

mir_as82

Ansi C de bu acik kapi birakilmis. Yani bu derleyici uretenlerin tercihine birakilmis bir konu.

mehmet

Alıntı yapılan: zengdai - 11 Temmuz 2014, 01:37:09
A common C programming error is to do something like:
i16 = i8 * 100;
When the intent was:
i16 = (long) i8 * 100;

Bu değişken tiplerini işaretli olarak değerlendirmek taraftarıyım.
Zira i8, i16 verişmiş. u8, u16 verilmiş olsaydı işaretsiz sayı
olarak düşünebilecektik...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr