符号なしデータ型とは何ですか?


90

このunsigned「タイプレス」タイプが数回使用されているのを見たことがありますが、その説明は見たことがありません。対応するsignedタイプがあると思います。次に例を示します。

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

これまでに収集したもの:
-私のシステムではsizeof(unsigned) = 4(32ビットのunsigned intでヒント)
-別の型をunsignedバージョンにキャストするための省略形として使用される可能性があります:

signed long int i = -42;
printf("%u\n", (unsigned)i);

これはANSICですか、それとも単なるコンパイラ拡張ですか?

回答:



30

unsignedを意味しunsigned intます。 signedを意味しsigned intます。justを使用するunsignedことはunsigned int、Cでを宣言する怠惰な方法です。はい、これはANSIです。


14

歴史的にCでは、データ型を省略した場合、「int」が想定されていました。したがって、「unsigned」は「unsignedint」の省略形です。これは長い間悪い習慣と考えられてきましたが、それを使用するコードはまだかなりあります。


6
それが悪い習慣だとは知りませんでした。これには理由がありますか? longの代わりlong intは非常に一般的であるため、unsigned代わりのunsigned intが受け入れられない理由がわかりません。
CBベイリー

10
@Charles Bailey:最近-少なくとも正式ではなく実用的である場合-long、int、short、charは、サイズが異なる可能性があるため、異なるデータ型と見なされます)、unsigned(およびデフォルトのsigned)は修飾子。したがって、「unsignedlong」または「unsignedchar」を使用するのと同じ方法で「unsignedint」を使用する傾向があります(そして、intを見逃しただけではないことが明らかになります)。「longint」または「shortint」のintは不要です。
ディップスティック

1
@Dipstick、「long」は「int」の修飾子です。「unsignedint」のintは、「unsignedlongint」のintと同じくらい不要なようです。
コンラッドマイヤー

1
これは、暗黙の「int」ルールと同じではありません。この答えは誤解を招くものです。

7

Cではunsigned、はのショートカットですunsigned int

あなたは同じですlongそれはのためのショートカットですlong int

また、を宣言することもできunsigned longます(になりますunsigned long int)。

これはANSI規格に準拠しています


はい。unsigned同じですunsigned intが、私は上の検索やったWG14 / N1124委員会草案を- 2005年5月6日ISO / IEC 9899:TC2のためunsignedとは定義されている場所...あなたはそれが定義されている部分を引用可能性が見つけることができませんでしたか?
user454322 2014年

5

CおよびC ++の場合

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

nビットを含む符号なし整数は、0から(2 ^ n-1)までの値を持つことができます。これは2 ^ n個の異なる値です。

符号なし整数は正またはゼロのいずれかです。

符号付き整数は、2の補数を使用してコンピューターに格納されます。


2

C176.7.2§2によると:

タイプ指定子の各リストは、次のマルチセットのいずれかでなければなりません(アイテムごとに複数のマルチセットがある場合は、コンマで区切ります)。型指定子は任意の順序で発生する可能性があり、他の宣言指定子と混在している可能性があります

— void
— char
—符号付きchar
— unsigned char
— short、signed short、short int、またはsigned short int
— unsigned short、またはunsigned short int
— int、signed、またはsigned int
— unsigned、またはunsigned int
— long、signed long 、long int、またはsigned long int
— unsigned long、またはunsigned long int
— long long、signed long long、long long int、またはsigned long long int
— unsigned long long、またはunsigned long long int
— float
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
—アトミック型指定子
—構造体または共用体指定子
—列挙型指定子
—typedef名

だから、場合によってunsigned int、私たちはどちらか書くことができるunsignedunsigned int、または私達は狂気を感じている場合int unsigned。後者は、標準が「...任意の順序で発生する可能性があり、混合される可能性がある」ことを許可するのに十分愚かであるためです。これは言語の既知の欠陥です。

適切なCコードはを使用しunsigned intます。


1

別の質問から私の答えを持ってきてください。

C仕様、セクション6.7.2:

— unsigned、またはunsigned int

つまりunsigned、タイプが指定されていない場合、デフォルトでunsigned int。になります 。したがって、書くことunsigned aはと同じunsigned int aです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.