2012-08-25 11 views
33

uint16_tとuint32_tの値を表示しようとしていますが、目的のo/pが与えられていません。uint32_tとuint16_t変数の値を印刷する方法は?

#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; 
} 

Iは、エラーを示している

printf("%"PRIu32, a); 

を用います。

どのようにこれらの値を印刷するには、何があなたがintN_tタイプとその兄弟のためにすべてのそれらの気の利いた新しいフォーマット指定をしたい場合inttypes.hを含める必要が希望O/P

+3

(正確な)エラーメッセージを表示するのは、単に「エラーを示している」というよりはむしろ役立つでしょう。そして、単に「希望のo/pを与えない」よりも、実際の出力を見せてください(そして「o/p」を書くのではなく、「出力」という単語を書きます)。 –

答えて

53

なり、であることあなたのコンパイラがC99に準拠していれば、それを行う正しい(つまり、ポータブルな)方法です。サイズがあなたの考えと異なる場合は、%dまたは%uのような標準のものを使用しないでください。

これにはstdint.hが含まれ、printf/scanfファミリの呼び出しに使用できるマクロなど、他の多くのものが含まれています。これは、ISO C99規格のセクション7.8でカバーされています。例えば

、以下のプログラム:

#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; 
} 

出力:

1234 
5678 
12

<inttypes.h>で定義されたマクロは等々タイプuint32_tuint16_tの値を出力するための最も正確な方法であり、 - しかし、それは唯一の方法ではありません。

個人的には、これらのマクロを覚えにくく使いにくいことがわかります。 (printfのフォーマット文字列の構文が与えられれば、おそらく避けられないだろう;私はより良いシステムを思い付くことができないと主張していない)

代わりに、値を定義済みの型にキャストし、そのタイプ。

タイプintunsigned int広い少なくとも16ビットであることが言語によって保証され、したがって、それぞれ、タイプint16_tuint16_t又は任意の変換値を保持できるようにします。同様に、longunsigned longは少なくとも32ビット幅であり、long longunsigned long longは少なくとも64ビット幅です。例えば

、私は(いくつかの追加の調整で)このようなあなたのプログラムを書くことがあります。このアプローチの

#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; 
} 

一つの利点は、それもサポートしていない事前C99の実装で動作することができるということです<inttypes.h>。このような実装では、おそらく<stdint.h>がありませんでしたが、このテクニックは他の整数型には便利です。

+1

ここでは、符号付きintが2の補数でない場合、非常に小さなエッジケースが1つあります。その場合、負の2の補数値を正しく保持しません。非常にマイナーな、私は認めますが、あなたが最大限の移植性を望んでいるかどうか気になるものはあります。 – paxdiablo

+1

@paxdiablo: 'intN_t'型は2の補数で、パディングビットは必要ありません。 'int'が2の補数でない場合、インプリメンテーションが異なる2の補数の型をサポートしていない限り、おそらく' intN_t'型は定義されません。良い点ですが、私はあなたが示唆しているよりもはるかにマイナーなエッジケースだと思います。 –

+1

疑いはありません。私は、新しい積分型を装備した惑星上の機械を見つけてもまだ1の補数または符号/大きさのint型を持っているマシンを見つけるのは難しいと思う:-) – paxdiablo

-2

私の場合は、%uを使用して、uint32_tタイプの値を出力するだけです。それは動作します。

uint32_t i = 31 - __builtin_clz(mask); 

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

これは、 'sizeof (unsigned int)!= sizeof(uint32_t) 'となります。 – user694733

+0

おかげで。そして私は '%08x'を使ってそれを提示できることも発見しました。これはバイナリとして表示されます。 –

+1

'%08x'は'%u'と同じ問題があります。また、値を16進数で表示します。標準のprintfにはバイナリ指定子はありません。 – user694733

関連する問題