2012-08-25 17 views
33

uint16_t ve uint32_t değerlerini yazdırmaya çalışıyorum ama istenen o/p değerini vermiyor. Uint32_t ve uint16_t değişkenleri değeri nasıl yazdırılır?

#include<stdio.h> 
#include <netinet/in.h> 

int main() 
{ 
    uint32_t a=12,a1; 
    uint16_t b=1,b1; 
    a1=htonl(a); 
    printf("%d---------%d",a1); 
    b1=htons(b); 
    printf("\n%d-----%d",b,b1); 
    return 0; 
} 

Ayrıca, bir hatayı gösteren bir
printf("%"PRIu32, a); 

kullanılır.

Nasıl bu değer yazdırmak için ve hangi

+3

Sadece "gösteren hata" olduğunu söylemek yerine (kesin!) Hata iletisini bize göstermek çok daha yararlı olurdu. Ve sadece "istenen o/p vermektense" yerine, gerçek çıktıyı göster (ve "o/p" yazmak yerine "çıktı" sözcüğünü heceleyerek). –

cevap

53

Sen intN_t türleri ve onların kardeşleri olan tüm bu şık yeni format belirteçleri istiyorsanız inttypes.h eklemeniz gerekir istenen o/p olacak ve o olduğunu Derleyicinizin C99 ile uyumlu olması koşuluyla, doğru (yani taşınabilir) bir yol. Boyutların düşündüğünüzden farklı olması durumunda, %d veya %u gibi standart olanları kullanmamalısınız.

stdint.h içerir ve printf/scanf çağrı ailesi için kullanılabilecek makrolar gibi birkaç şeyle genişletir. Bu, ISO C99 standardının 7.8 bölümünde ele alınmıştır.

Örneğin, aşağıdaki programı:

#include <stdio.h> 
#include <inttypes.h> 
int main (void) { 
    uint32_t a=1234; 
    uint16_t b=5678; 
    printf("%" PRIu32 "\n",a); 
    printf("%" PRIu16 "\n",b); 
    return 0; 
} 

çıkışlar:

1234 
5678 
12

makro <inttypes.h> tanımlanan benzeri türde uint32_t, uint16_t değerlerini yazdırmak için en doğru yol, ve - - ama tek yol onlar değil. Şahsen, bu makroları hatırlamakta zorlandım ve kullanması zor buluyorum. (printf biçimindeki dizgenin sözdizimi göz önüne alındığında, bu muhtemelen kaçınılmaz; daha iyi bir sistemle gelebileceğimi iddia etmiyorum.)

Değerler önceden tanımlanmış bir türe dökülmeli ve bu tip.

türleri int ve unsigned int geniş en az 16 bit olacak şekilde bir dil tarafından temin edilmektedir, ve bu yüzden, sırasıyla tip int16_t veya uint16_t herhangi dönüştürülen değeri tutmak için. Benzer şekilde, long ve unsigned long en az 32 bit genişliğinde ve long long ve unsigned long long en az 64 bit genişliğindedir.

Örneğin, ben (birkaç ek tweaks ile) böyle programınızı yazabiliriz:

Bu yaklaşımın
#include <stdio.h> 
#include <stdint.h> 
#include <netinet/in.h> 

int main(void) 
{ 
    uint32_t a=12, a1; 
    uint16_t b=1, b1; 
    a1 = htonl(a); 
    printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1); 
    b1 = htons(b); 
    printf("%u-----%u\n", (unsigned)b, (unsigned)b1); 
    return 0; 
} 

bir avantajı bile desteklemeyen öncesi C99 uygulamaları ile çalışabilir olmasıdır <inttypes.h>. Böyle bir uygulama büyük olasılıkla <stdint.h>'a sahip olmaz, ancak bu teknik diğer tam sayı tipleri için yararlıdır.

+1

Burada imzalanan int, iki tamamlayıcı değilse, burada çok küçük bir kenar durumu var. Bu durumda, en olumsuz iki'nin tamamlama değerini doğru olarak tutmaz. ÇOK küçük, itiraf etmeliyim ama maksimum taşınabilirlik istiyorsanız dikkat etmeniz gereken bir şey. – paxdiablo

+1

@paxdiablo: 'intN_t' türlerinin, dolgu bitleriyle birlikte ikiye tamamlayıcı olması gerekir. Eğer int 'ikiye tamamlayıcı değilse,' intN_t 'türleri muhtemelen tanımlanmayacaktır * * uygulama, farklı iki'nin tamamlayıcı türlerini de desteklemez. İyi bir nokta, ama bence önerdiğinden daha küçük bir durum. –

+1

Şüphesiz. Gezegendeki yeni integral tiplerin bir araya geldiği bir makineyi bulmakta zorlandığınızdan şüpheliyim, yine de hala bir tamamlayıcılık veya işaret/büyüklük 'int 'tipi :-) var – paxdiablo

-2

Durumumda uint32_t türüyle değeri vermek için %u kullanıyorum. Çalışıyor.

örn.

uint32_t i = 31 - __builtin_clz(mask); 

    D("read i= %u ", __FUNCTION__, i); 
+2

Bu, sistemlerin tanımlanamayan davranışlarına neden olacaktır. (imzasız int)! = sizeof (uint32_t) '. – user694733

+0

Teşekkürler kardeşim. Ayrıca bunu sunmak için '% 08x' kullanabileceğimizi de öğrendim. İkili olarak görüntülenecektir. –

+1

'% 08x' kullanma '% u' ile aynı sorunu yaşıyor. Ayrıca, değeri onaltılık sayı olarak görüntüler; standart C printf'de ikili belirteci yoktur. – user694733

İlgili konular