Dersler

View on GitHub

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$

#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
#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 
#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
#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:

Bu tür çevrimlere implicit (kapalı) tür dönüşümü denir.

Kapalı çevrim aşağıdaki durumlarda olur:

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

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",&para_girisi);
  printf("para cikis miktarini giriniz:");
  scanf("%f",&para_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",&para_girisi);
  printf("para cikis miktarini giriniz:");
  scanf("%f",&para_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