2013-06-25 20 views
7

A question最近、ULLまたはLLUがCの符号なしlong型定数を指定するのに有効かどうかが尋ねられました。どちらも有効ですが、unsigned long longと一致しているのでULLが好ましいと考えていました。Cでは 'long unsigned'は 'unsigned long'と有効ですか?

しかし、私は今確信していません。 gccコンパイラは文句なしで、次の許可:

int main(void) { 
    unsigned int a = 1; 
    int unsigned b = 2; 
    return 0; 
} 

だから私の質問です:int unsignedあり、そして標準に従ってlong long unsigned、有効なタイプのような他のバリエーション? 6.2.5 Types

答えて

14

ISO C11標準の状態:

signed char型、short int型、int型、long int型、および長い長いintとして指定された5つの標準符号付き整数型があります。

それぞれの符号付き整数型には、同じ量の記憶領域(符号情報を含む)を使用し、同じ配置要件を持つ、対応する(しかし異なる)符号なし整数型(キーワード符号なし) 。

しかし基本型とunsigned修飾子が現れるにとしてそのセクションには義務はありません。

制御部は、後で標準である、6.7.2 Type specifiersは、ここに言い換え:

型指定子はvoidcharshortintlongfloatdoublesignedunsigned_Bool_Complex<struct-or-union-specifier>あります、<enum-specifier>、および<typedef-name>

少なくとも1つの型指定子は、各宣言の宣言指定子と、各struct宣言と型名の指定子修飾子リストに与えられます。型指定子の各リストは、以下のマルチセット(項目ごとに複数のマルチセットがある場合はコンマで区切られます)のいずれかになります。型指定子は任意の順序で出現する可能性があり、他の宣言指定子と混在する可能性があります。

その後、unsigned long, or unsigned long intなどのすべてのマルチセットの一覧が表示されます。

しかしthe type specifiers may occur in any orderは、これらのすべては、そのマルチセットのために有効であることを意味し、そこでの重要なフレーズ:

unsigned long 
long unsigned 

unsigned long int 
unsigned int long 
long unsigned int 
long int unsigned 
int unsigned long 
int long unsigned 
+5

家庭では絶対にしないでください。 –

+4

もっと分かりにくい例として、 'typedef int i;'と 'int typedef i;'は等価であることに注意してください。 – Mankarse

+0

@Mankarse、良い点、6.7では、 'typedef'のようなストレージクラス指定子と' int'のような型指定子を並べ替えることができます。野生の中で 'int typedef something 'を見たことが二度見なければなりません。私はほぼ確実に追跡し、 'i'を型名として使用した人を破棄します: – paxdiablo

0

指定子どちらでもいいの順序は。

unsigned long long is the same as long long unsigned. 

どちらのタイプもC規格(c99)で有効です。

+1

これは特にどこかで引用されたのですか、それとも単に引用ボックスに入れましたか? – Potatoswatter

+0

http://stackoverflow.com/questions/17287680/literal-types-0x1ull-vs-0x1llu – haccks

+0

あなたはどう思いますか? – haccks