web-dev-qa-db-ja.com

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

このunsigned "typeless"タイプが数回使用されているのを見たことがありますが、説明はありません。対応する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ビット符号なし整数でヒント)
-これは、別の型を署名なしバージョンにキャストするための省略形として使用される場合があります。

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

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

83
hhaamu

unsignedは実際にはunsigned intの省略形であり、標準Cで定義されています。

134

unsignedunsigned intを意味します。 signedsigned intを意味します。 unsignedのみを使用することは、Cでunsigned intを宣言する怠zyな方法です。はい、これはANSIです。

30
Polaris878

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

12
anon

cでは、unsignedunsigned intのショートカットです。

long intのショートカットであるlongにも同じことがあります

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

これはANSI標準にあります

7
ThibThib

CおよびC++で

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

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

符号なし整数は正またはゼロです。

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

4
Rabindra Sah

持参 別の質問からの回答

C仕様 のセクション6.7.2から:

—符号なし、または符号なし整数

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

1
Bruno Ferreira

C17 6.7.2§2によると:

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

—無効
— 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
- 浮く
—ダブル
—ロングダブル
— _Bool
— float _Complex
—ダブル_Complex
— long double _Complex
—原子型指定子
—構造体または共用体指定子
—列挙指定子
— typedef名

したがって、unsigned intの場合は、unsignedまたはunsigned intのいずれか、または気が狂っている場合はint unsignedと書くことができます。後者は、標準が「...任意の順序で発生する可能性があり、混在する可能性がある」ために十分に愚かであるためです。これは、言語の既知の欠陥です。

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

1
Lundin