C Dilinde Herhangi Şeyler Volume-1

Mesut Topuzlu
2 min readFeb 12, 2021

--

Merhaba sevgili okurlar. Bugün sizlere birazcık C dilinde belki daha önce karşılaştığınız, belki herkesin bildiği ve bunu benim bilmediğim belki de hiç duymadığınız herhangi şeylerden bahsedeceğim.

Saygıdeğer konuğumuz char bu hafta. Char tipi sanırım C dilinin big-bang’inden beri var ve karakterleri hafızada sembolize etmek için kullanılıyor. Örnek vermek gerekirse;

char c = 'A';

dediğimizde bellekte A harfinin ASCII karşılığı olan 65 (veya hex notasyonu ile 0x41) sayısını tutar. Şunlarda da mümkündür;

char c;
c = 65;
c = 0x41;
printf("karakter : %c\n", c); //ekrana karakter : A basar

C dilinde char tipi değişkenlerin genişliği 1-byte olarak belirlenmiştir (Asilik yapıp 2-byte tanımlayan C derleyicisi var mıdır bilemem). Bu da demek oluyor ki ASCII tabloda karşılığı olmayan 1-byte’lık bir sayıyı da bellekte char tipinde tutabiliriz.

Şimdi canımız sıkıldı, bir IDE/editör açtık ve şöyle bir kod yazdık;

#include <stdio.h>
int main()
{
char x = 0xF0; //en soldaki bit (MSB) 1 olduğundan negatif değer.
unsigned char y = 0xF0; //işaretsiz bir sayıyı temsil et.

if(x != y)
printf("naber mudur\n");
else
printf("bir enayilik var bu iste\n");

return 0;
}

Şimdi burada her iki değişkene de olayın daha iyi gözükmesi açısından aynı sayısal değeri (0xF0) veriyorum. Derleyici düz char için bu değeri MSB biti (yani sign bitini) 1 olduğundan negatif (-16), unsigned char için ise pozitif (240) olarak değerlendireceğinden işlem sonucu bizim beklediğimiz gibi “naber mudur” olur. Yani x ve y’nin eşit OLMAMASI aynı değer vermişiz gibi gözükse de bizim beklediğimiz bir durumdur.

Yine bigün canınız sıkılıyor böyle ve yukarıdaki kodu farklı bir derleyicide derlediniz. Mesela MSP430 MCU’lar için kullandığımız Code Composer Studio (CCS)’da derlediniz ve seri porttan veri göndererek, debug yaparak, led yakarak vb. çeşitlik takla tipleriyle x ve y’nin eşit olmadığına dair bir emare gösterilmesini dilediniz… Fakat üzülerek söylüyorum ki dilekleriniz kabul olmadı. Peki ama neden?

Çünkü bazı derleyiciler char tipini bizim sandığımız gibi işaretli (signed), fakat bazıları ise default olarak (işaretsiz) unsigned olarak tanımlar. İşte CCS, düz char’ı default olarak unsigned olarak kabul etmektedir. Peki biz bu durumu düzeltemez miyiz? Tabii ki düzeltebiliriz. Aşağıdaki derleme opsiyonlarını (flag) derleyiciye bildirdiğimizde bunu gerçekleştirebiliriz;

GCC’da;
-funsigned-char : char’ı işaretsiz olarak değerlendir.
-fsigned-char : char’ı işaretli olarak değerlendir (sanırım default olan bu)

MSVC dokümanında şöyle belirtilmiş; “The /J option defines _CHAR_UNSIGNED” yani bu opsiyonu kullandığımızda düz char, unsigned char olacak.

Code Composer Studio için; derleyici ayarlarında;

–plain_char=signed veya –plain_char=unsigned gibi bir seçenek mevcut ve default olarak unsigned seçilmiş durumda.

Yine STM32 MCU’lar için Eclipse IDE’na baktığımda default char işaretli yani signed.

Belki sizin önünüze çok büyük bir engel olarak çıkmaz fakat yazılıma başlamadan önce IDE, derleyici ve ya ortam ayarlarını incelemenizde her zaman fayda vardır.

Sağlıcakla kalın….

--

--