この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ですか、それとも単なるコンパイラ拡張機能ですか?
unsigned
は実際にはunsigned int
の省略形であり、標準Cで定義されています。
unsigned
はunsigned int
を意味します。 signed
はsigned int
を意味します。 unsigned
のみを使用することは、Cでunsigned int
を宣言する怠zyな方法です。はい、これはANSIです。
歴史的にCでは、データ型を省略した場合、「int」が想定されていました。したがって、「unsigned」は「unsigned int」の省略形です。これは長い間悪い習慣と考えられてきましたが、それを使用するコードがまだかなりあります。
cでは、unsigned
はunsigned int
のショートカットです。
long int
のショートカットであるlong
にも同じことがあります
また、unsigned long
を宣言することもできます(unsigned long int
になります)。
これはANSI標準にあります
CおよびC++で
unsigned = unsigned int (Integer type)
signed = signed int (Integer type)
Nビットを含む符号なし整数は、0から(2 ^ n-1)までの値を持つことができ、これは2 ^ nの異なる値です。
符号なし整数は正またはゼロです。
符号付き整数は、2の補数を使用してコンピューターに保存されます。
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
を使用します。