EEM-119 Algoritma ve Programlama I Dersi
2022-2023 Güz Dönemi Ders 9
İşaretli ve işaretsiz tamsayı türleri ve sınırları
Negatif sayı kullanılmayacaksa değişkenlerin önüne unsigned konulur.
Bu durumda tam sayı türleri:
char
unsigned char
short int
unsigned short int
int
unsigned int
long int
unsigned long int
Başka niteleyiciler kullanıldığında int yazılması zorunlu değildir. Yani sadece long yazmak long int anlamına gelir.
#include <stdio.h>
int main(){
printf("char turu: %d byte\n",sizeof(char));
printf("unsigned char turu: %d byte\n",sizeof(unsigned char));
printf("short turu: %d byte\n",sizeof(short));
printf("unsigned short turu: %d byte\n",sizeof(unsigned short));
printf("int turu: %d byte\n",sizeof(int));
printf("unsigned int turu: %d byte\n",sizeof(unsigned int));
printf("long turu: %d byte\n",sizeof(long));
printf("unsigned long turu: %d byte\n",sizeof(unsigned long));
return 0;
}
char turu: 1 byte
unsigned char turu: 1 byte
short turu: 2 byte
unsigned short turu: 2 byte
int turu: 4 byte
unsigned int turu: 4 byte
long turu: 8 byte
unsigned long turu: 8 byte
Buradaki formülleri doğru bir şekide görmek için tıklayınız
char: $-2^7$ - $2^7-1$
unsigned char: $0$ - $2^8-1$
short: $-2^{15}$ - $2^{15}-1$
unsigned short: $0$ - $2^{16}-1$
int: $-2^{31}$ - $2^{31}-1$
unsigned int: $0$ - $2^{32}-1$
long: $-2^{63}$ - $2^{63}-1$
unsigned long: $0$ - $2^{64}-1$
genel formu
eğer değişken m byte ise $n=m \times 8$ bittir. Dolayısyıla işaretli olarak $-2^{n-1}$ - $2^{n-1}-1$ sayısı arasında değer alır. İşaretsiz ise (unsigned) $0$ - $2^n-1$
- 8, 10, 16 tabanında atama ve değerleri görme
#include <stdio.h>
int main(){
int a=10;
printf("a: %d\n",a);
// 8 tabaninda deger atama
a=010;
printf("a: %d\n",a);
//16 tabaninda deger atama
a=0x10;
printf("a: %d\n",a);
return 0;
}
a: 10
a: 8
a: 16
#include <stdio.h>
int main(){
int a=47;
printf("a: %d\n",a);
// 8 tabaninda deger atama
a=047;
printf("a: %d\n",a);
//16 tabaninda deger atama
a=0x47;
printf("a: %d\n",a);
return 0;
}
a: 47
a: 39
a: 71
#include <stdio.h>
int main(){
int a;
a=0x4b7af3;
printf("onluk a: %d\n",a);
//8 tabani: octal
printf("sekizlik a: %o\n",a);
//16 tabani:hexadecimal
printf("onluk a: %x\n",a);
printf("onluk a: %X\n",a);
return 0;
}
onluk a: 4946675
sekizlik a: 22675363
onluk a: 4b7af3
onluk a: 4B7AF3
Taşma
#include <stdio.h>
int main(){
unsigned char a;
a=0xFE; // 2 tabaninda a=1111 1110
printf("onluk a: %d\n",a);
printf("onluk a: %X\n",a);
a++; // 2 tabaninda a=1111 1111
printf("onluk a: %d\n",a);
printf("onluk a: %X\n",a);
a++; // 2 tabaninda a=1 0000 0000 taşma var (overflow)
printf("onluk a: %d\n",a);
printf("onluk a: %X\n",a);
return 0;
}
onluk a: 254
onluk a: FE
onluk a: 255
onluk a: FF
onluk a: 0
onluk a: 0
#include <stdio.h>
int main(){
signed char a;
a=0x7E; // 2 tabaninda a=0111 1110
printf("onluk a: %d\n",a);
printf("onluk a: %X\n",a);
a++; // 2 tabaninda a=0111 1111
printf("onluk a: %d\n",a);
printf("onluk a: %X\n",a);
a++; // 2 tabaninda a=1000 0000 taşma var (overflow)
printf("onluk a: %d\n",a);
a++;
printf("onluk a: %d\n",a);
return 0;
}
onluk a: 126
onluk a: 7E
onluk a: 127
onluk a: 7F
onluk a: -128
onluk a: -127
#include <stdio.h>
int main(){
unsigned int a;
//işaretsiz (unsigned)değişkenlerin değeri için %u kullanilir.
a=0xFFFFFFFE; // 2 tabaninda a=1111 1111 1111 1111 1111 1111 1111 1110
printf("onluk a: %u\n",a);
printf("onluk a: %X\n",a);
a++; // 2 tabaninda a=1111 1111 1111 1111 1111 1111 1111 1111
printf("onluk a: %u\n",a);
printf("onluk a: %X\n",a);
a++; // a=1 0000 0000 0000 0000 0000 0000 0000 0000 taşma var (overflow)
printf("onluk a: %u\n",a);
printf("onluk a: %X\n",a);
a++;
printf("onluk a: %u\n",a);
printf("onluk a: %X\n",a);
return 0;
}
onluk a: 4294967294
onluk a: FFFFFFFE
onluk a: 4294967295
onluk a: FFFFFFFF
onluk a: 0
onluk a: 0
onluk a: 1
onluk a: 1
- Ondalıklı sayılardan pozitif yazılabilecek küçük sayılar ve en büyük sayılar:
float: 32 bit: $1.17 \times 10^{-38}$ - $3.34 \times 10^{38}$
double: 64 bit $2.22 \times 10^{-308}$ - $1.79 \times 10^{308}$
#include <stdio.h>
int main(){
// ondalikli sabit sayılarin türü double dır
// a+1.0 ifadesindeki 1.0 sayısının türü double dir.
// bundan dolayı eğer a değişkenin türü float ise
// 1.0 sayısının türünün de float olması için bazen
// 1.0f şeklinde yazılabilir.
return 0;
}
Karakter türü
#include <stdio.h>
int main(){
char ch;
ch='a';
printf("ch: %d, ch:%c\n",ch,ch);
ch='A';
printf("ch: %d, ch:%c\n",ch,ch);
ch='0';
printf("ch: %d, ch:%c\n",ch,ch);
ch=' ';
printf("ch: %d, ch:%c\n",ch,ch);
return 0;
}
ch: 97, ch:a
ch: 65, ch:A
ch: 48, ch:0
ch: 32, ch:
#include <stdio.h>
int main(){
//karakter kucuk ise buyuk harfe cevirme icin
char ch;
printf("bir karakter giriniz: ");
scanf("%c",&ch);
printf("ch: %d, ch:%c\n",ch,ch);
if('a'<= ch && ch <= 'z')
ch = ch - ('a'-'A');
printf("ch: %d, ch:%c\n",ch,ch);
return 0;
}
bir karakter giriniz:
c
ch: 99, ch:c
ch: 67, ch:C
bir karakter giriniz:
B
ch: 66, ch:B
ch: 66, ch:B
#include <stdio.h>
int main(){
//kucuk harfler
char ch;
for(ch='a';ch<='z';ch++)
printf("%c ",ch);
return 0;
}
a b c d e f g h i j k l m n o p q r s t u v w x y z
#include <stdio.h>
int main(){
//buyuk harfler
char ch;
for(ch='A';ch<='Z';ch++)
printf("%c ",ch);
return 0;
}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
#include <stdio.h>
int main(){
//karakter kucuk ise buyuk harfe cevirme icin
char ch;
for(ch=45;ch<=65;ch++)
printf("%c ",ch);
return 0;
}
- . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A
- girilen bir ifadenin uzunluğu
#include <stdio.h>
int main(){
char ch;
int len=0;
printf("bir metin giriniz: ");
do{
scanf("%c", &ch);
len++;
}while(ch!='\n');
printf("metnin uzunlugu: %d",len);
return 0;
}
bir metin giriniz
abc
metnin uzunlugu: 4
- getchar() fonskiyonu kullanımı
#include <stdio.h>
int main(){
char ch;
int len=0;
printf("bir metin giriniz: ");
do{
ch=getchar();
len++;
}while(ch!='\n');
printf("metnin uzunlugu: %d",len-1);
return 0;
}
bir metin giriniz:
abcdef
metnin uzunlugu: 6
#include <stdio.h>
int main(){
char ch;
int len=0;
printf("bir metin giriniz: ");
ch=getchar();
while(ch!='\n'){
len++;
ch=getchar();
}
printf("metnin uzunlugu: %d",len);
return 0;
}
bir metin giriniz:
abc
metnin uzunlugu: 3
#include <stdio.h>
int main(){
int len=0;
printf("bir metin giriniz: ");
while(getchar() !='\n')
len++;
printf("metnin uzunlugu: %d",len);
return 0;
}
bir metin giriniz:
abc
metnin uzunlugu: 3
Tür dönüşümü
örnekler:
- Bir int ile bir short işleme girerse, short int’e çevrilir.
- Bir int ile float işleme girerse, int floate çevrilir.
- Bir double ile float işleme girerse float double çevrilir.
Bu tür çevrimlere implicit (kapalı) tür dönüşümü denir.
Kapalı çevrim aşağıdaki durumlarda olur:
- Aritmetik ve lojik işlemlerde operandlar aynı değilse.
- Atama durumunda atanan ve atanılanın türü farklı ise. Örnek int türündeki a değişkenine double türün atanması: a=3.13
Açık tür dönüşümü (explicit)
Değişkenin önüne parantez içinde dönüşmesini istediğimiz türü yazarız.
Sayının tam ve ondalıklı kısımlarının ayrılması.
#include <stdio.h>
int main(){
float ondalikli_sayi, ondalik;
printf("ondalikli bir sayi giriniz");
scanf("%f",&ondalikli_sayi);
printf("sayinin tam kismi: %d\n",(int)ondalikli_sayi);
ondalik=ondalikli_sayi-(int)ondalikli_sayi;
printf("sayinin ondalikli kismi: %f\n",ondalik);
return 0;
}
ondalikli bir sayi giriniz
3.14
sayinin tam kismi: 3
sayinin ondalikli kismi: 0.140000
- Kesirli sayının ondalık karşılığı
Hatalı program
#include <stdio.h>
int main(){
// a/b sayisinin karsiligi
int a, b;
float sayi;
printf("a/b seklinde bir sayi giriniz:");
scanf("%d/%d",&a,&b);
sayi=a/b;
printf("girilen sayinin karsiligi: %f",sayi);
return 0;
}
a/b seklinde bir sayi giriniz:
5/3
girilen sayinin karsiligi: 1.000000
#include <stdio.h>
int main(){
// a/b sayisinin karsiligi
int a, b;
float sayi;
printf("a/b seklinde bir sayi giriniz:");
scanf("%d/%d",&a,&b);
sayi=(float)a/b;
// sayi=(float)a/(float)b;
// sayi=a/(float)b;
printf("girilen sayinin karsiligi: %f",sayi);
return 0;
}
a/b seklinde bir sayi giriniz:
5/3
girilen sayinin karsiligi: 1.666667
Tür tanımlama
#include <stdio.h>
#define TL float
int main(){
TL para_girisi, para_cikisi, mevcut_para;
printf("mevcut para miktarini giriniz:");
scanf("%f",&mevcut_para);
printf("para giris miktarini giriniz:");
scanf("%f",¶_girisi);
printf("para cikis miktarini giriniz:");
scanf("%f",¶_cikisi);
printf("yeni para miktari: %.2f",mevcut_para-para_cikisi+para_girisi);
return 0;
}
mevcut para miktarini giriniz:
5000
para giris miktarini giriniz:
2000
para cikis miktarini giriniz:
1500
yeni para miktari: 5500.00
#include <stdio.h>
typedef float TL;
int main(){
TL para_girisi, para_cikisi, mevcut_para;
printf("mevcut para miktarini giriniz:");
scanf("%f",&mevcut_para);
printf("para giris miktarini giriniz:");
scanf("%f",¶_girisi);
printf("para cikis miktarini giriniz:");
scanf("%f",¶_cikisi);
printf("yeni para miktari: %.2f",mevcut_para-para_cikisi+para_girisi);
return 0;
}
mevcut para miktarini giriniz:
5000
para giris miktarini giriniz:
2000
para cikis miktarini giriniz:
1500
yeni para miktari: 5500.00