Standart C Programlama Dili


3.P. Problemler

1. Bizim ortamımızda

#include <stdio.h>
int main (void)
{
  short x;
  printf("%lu %lu\n", (unsigned long)&x, (unsigned long)(&x+1));
  printf("%lu %lu\n", (unsigned long)&x, (unsigned long)&x+1);
  return 0;
}

programı

2147480800 2147480802
2147480800 2147480801

sonucunu görüntülemektedir. Tahmin edebileceğiniz gibi, bunlar bellek adresleridir. Neden ilk durumda fark 2 iken, ikinci durumda 1’dir? İlk durumdaki fark ne ifade eder?

2. Eğer makinenizde (işaretli) bir tamsayı üzerinde yapılan bir sağa kaydırma (>>) işlemi esnasında boşalan yerler işaret bitiyle dolduruluyorsa isaret-doldurma, aksi takdirde sifir-doldurma mesajını verecek bir program yazınız. Sisteminiz hakkında (sözcük uzunluğu gibi) herhangi bir varsayım yapmayın.

3. Girilen işaretsiz bir tamsayıda 1 olan bitleri sayan bir program yazınız.

4. Aşağıdaki deyimler ne yapar?

a ^= b;
b ^= a;
a ^= b;

Açıklayınız. İpucu: Başlangıçta a’nın 0077, b’nin de 0707 içerdiğini varsayın. Son değerleri ne olacaktır?

5. Zaman da 16 bit içine aşağıdaki gibi paketlenebilir: 5 bit saat, 6 bit dakika, 5 bit saniye. Saniyeleri 5 bite sığdırmak için değeri 2 ile bölün, yani saniyenin en sağındaki biti atın. Bunu yerine getirecek bir program yazın.

6. Aşağıdaki kodun ne işe yaradığını açıklayın:

int i;
for (i=0; i<10; i++)
  printf("%d:%c\n",i,"QWERTYUIOP"[i]);

7. Birçok sistemde unsigned long en azından 32 bit uzunluğundadır. Bu tipten tanımlanmış kume1, kume2 ve kume3 değişkenleri, 0’dan 31’e kadar olan sayı kümelerini saklayabilecek “küme değişkenleri” olarak değerlendirilebilir. Bu durumda, aşağı işlemlerin en anlama geldiğini açıklayın:

(a) kume1 = kume2 = kume3 = 0;
(b) kume1 |= 1<<n;
(c) kume2 &= (~1)<<n;
(d) if (kume1==kume2) ...
(e) kume3 = kume1 | kume2;
(f) kume2 &= ~kume1;
(g) kume1 = kume3^kume2;

8. Kısım 3.4’te verilen örneği, çıkarma işlemini de yapacak şekilde geliştirin. İşaretli sonuçları da dikkate almanız gerekecektir.

9. Kısım 3.4’te verilen örneği dört işlemin tamamını yapacak hale getirin. MAKSR uzunluğunda iki sayıyı çarptığınız zaman elde edilecek en büyük sayının uzunluğu nedir? Tamsayı bölme işlemini nasıl yaparsınız?