Standart C Programlama Dili


9.7. inttypes.h: Tamsayı Tipleri İçin Biçim Dönüşümü

Bu başlık dosyası stdint.h başlık dosyasını içerir ve ona bazı eklemeler yapar. stdint.h başlık dosyası, uygulanan en geniş tamsayı türlerini temsil eden intmax_t ve uintmax_t türleri dahil olmak üzere, belirtilen bit genişliklerine sahip tamsayı türlerini tanımlar.

Aşağıdakine benzer bir yapı tipi tanımlanır:

typedef struct {
  intmax_t quot;
  intmax_t rem;
} imaxdiv_t;

Bu dosyada tanımlanan imaxdiv fonksiyonu, intmax_t tipinden iki sayıyı birbirine böler ve bölümü ile kalanı imaxdiv_t tipindeki bir yapıda depolar. imaxdiv’e ek olarak, bu başlık dosyası, intmax_t tipinde bir tamsayının mutlak değerini döndüren imaxabs fonksiyonunu ve karakter dizilerini intmax_t veya uintmax_t tipindeki tamsayılara dönüştürmek için dört fonksiyon daha bildirir:

intmax_t   imaxabs(intmax_t j)
imaxdiv_t  imaxdiv(intmax_t pay, intmax_t payda)
intmax_t   strtoimax(const char * sayig, char ** song, int taban)
uintmax_t  strtoumax(const char * sayig, char ** song, int taban)
intmax_t   wcstoimax(const wchar_t * sayig, wchar_t ** song, int taban)
uintmax_t  wcstoumax(const wchar_t * sayig, wchar_t ** song, int taban)

Bu dosya, ayrıca, printf ve scanf ailesi fonksiyonlarında dönüşüm tanımlaması olarak kullanılabilecek bazı karakter değişmezi makroları tanımlar. printf fonksiyonu dönüşüm tanımlaması makrolarının adları PRI önekiyle başlar, ardından bir dönüşüm belirteci (d, i, o, x veya X) ve bir tip adını ifade eden bir büyük harf dizisi gelir. Tip adları, stdint.h başlık dosyasında tanımlanmıştır. Örneğin, dönüşüm belirteci d olan makro adları şöyledir:

PRIdN
PRIdLEASTN
PRIdFASTN
PRIdMAX
PRIdPTR

Burada listelenen ilk üç makro adının sonundaki N harfi, belirli bir tipin bit genişliğini gösteren ondalık sayı için bir yer tutucudur. Yaygın olarak uygulanan değerler 8, 16, 32 ve 64’tür. Diğer PRI… makro adları, yukarıda verilen d tek karakteri yerine i, o, u, x veya X kullanırlar.

scanf fonksiyon ailesi tarafından kullanılan makrolarda PRI öneki yerine SCN öneki ile başlarlar:

SCNdN
SCNdLEASTN
SCNdFASTN
SCNdMAX
SCNdPTR

Diğer PRI… makro adları, yukarıda verilen d tek karakteri yerine i, o, u veya x kullanırlar.

Örnek olarak aşağıdaki programa bakalım:

#include <inttypes.h>
#include <stdio.h>
int main (void)
{
  float f;
  printf("En buyuk isaretsiz tamsayi: %" PRIuMAX "\n", UINTMAX_MAX);
  printf("f'nin adresi: %" PRIxPTR "\n", (uintptr_t)&f);
  printf("f'nin adresi: %p\n", (void *)&f);
}

Burada, ilk satırda işaretsiz en büyük tamsayının değeri bastırılır. İkinci satırda uygun bir onaltılı sayı dönüşüm tanımlaması kulllanılarak f değişkeninin adresi bastırılır. Üçüncü satırda zaten bildiğimiz bir dönüşüm tanımlaması kullanılmıştır. Buradaki PRI… makrolarının karşılığı bir karakter dizisi değişmezidir. Önişlemcinin arka arkaya yazılan ve aralarında, boşluk dışında, herhangi bir işaret olmayan karakter dizilerini birleştirip tek bir karakter dizisi değişmezine dönüştürdüğünü unutmayın.