サーチ…


Charは符号なしまたは符号付き

標準では、 charが符号付きか符号なしかを指定していません。異なるコンパイラでは、異なる方法で実装するか、コマンドラインスイッチを使用してコンパイラを変更することができます。

積分型のサイズ

以下の型は、 整数型として定義されます

  • char
  • 符号付き整数型
  • 符号なし整数型
  • char16_tchar32_t
  • bool
  • wchar_t

除いてsizeof(char) / sizeof(signed char) / sizeof(unsigned char) §3.9.1.1間で分割され、[basic.fundamental / 1]及び5.3.3.1 [expr.sizeof]、及び§ sizeof(bool) 、完全にインプリメンテーション定義され、最小サイズを持たないため、これらのタイプの最小サイズ要件は、標準のセクション3.9.1 [basic.fundamental]にあります。

charサイズ

C ++標準のすべてのバージョンでは、5.3.3.1で、 sizeofunsigned charsigned charcharchar型がsignedunsignedかを定義する実装です)に対して1を指定します。

C ++ 14

charは、UTF-8コードユニットを格納するのに適した256の異なる値を表現するのに十分な大きさです。

符号付きおよび符号なし整数型のサイズ

標準では、§3.9.1.2で、 signed charshort intintlong int 、およびlong long intからなる標準符号付き整数型のリストで、各型は少なくとも先行するlong long intそれはリストにあります。さらに、§3.9.1.3で規定されているように、これらの型のそれぞれは、対応する標準の符号なし整数型unsigned charunsigned short intunsigned intunsigned long int 、およびunsigned long long intを持ちます。対応する署名付きタイプさらに、§3.9.1.1で規定されているように、 charsigned charunsigned char両方と同じサイズと位置合わせの必要条件を持っています。

C ++ 11

C ++ 11より前のバージョンでは、 long longunsigned long longは正式にC ++標準の一部ではありませんでした。しかし、Cへの導入後、C99では、多くのコンパイラがlong long unsigned long long 整数型としてlong longサポートlong longれており、C型と同じ規則を持つ符号 unsigned long long 型の unsigned long long 型の unsigned long long 型がサポートlong longれています。

したがって、標準では次のことが保証されています。

1 == sizeof(char)  == sizeof(signed char) == sizeof(unsigned char)
  <= sizeof(short) == sizeof(unsigned short)
  <= sizeof(int)   == sizeof(unsigned int)
  <= sizeof(long)  == sizeof(unsigned long)
C ++ 11
 <= sizeof(long long) == sizeof(unsigned long long)

各タイプの具体的な最小サイズは、標準によって与えられていません。代わりに、各タイプにはサポートできる値の最小範囲があります。これは§5.2.4.2.1のC標準から継承された§3.9.1.3で規定されています。各タイプの最小サイズは、必要とされる最小ビット数を決定することによって、この範囲から概算することができます。どのプラットフォームでも、実際にサポートされているタイプの範囲は、最小値より大きくなる可能性があることに注意してください。符号付きの型の場合、範囲は1の補数に対応し、より一般的に使用される2の補数には対応しないことに注意してください。これは、広範なプラットフォームが標準に準拠することを可能にするためです。

タイプ最小範囲必要な最小ビット数
signed char -127~127( - (2 7 -1)〜(2 7 -1)) 8
unsigned char 0〜255(0〜2 8 -1) 8
signed short -32,767~32,767( - (2 15 -1)〜(2 15 -1)) 16
unsigned short 0〜65535(0〜2 16 -1) 16
signed int -32,767~32,767( - (2 15 -1)〜(2 15 -1)) 16
unsigned int 0〜65535(0〜2 16 -1) 16
signed long -2,147,483,647~2,147,483,647( - (2 31 -1)〜(2 31 -1)) 32
unsigned long 0〜4,294,967,295(0〜2 32 -1) 32
C ++ 11
タイプ最小範囲必要な最小ビット数
signed long long -9,223,372,036,854,775,807 9,223,372,036,854,775,807に( - (2 63 - 1) - 1)(2〜63) 64
unsigned long long 0〜18,446,744,073,709,551,615(0〜2 64 -1) 64

各タイプは最小サイズ要件よりも大きくできるため、実装間で型のサイズが異なる場合があります。これの最も顕著な例は、LLP64システム(64ビットWindowsなど)が32ビットintslongを持ち、LP64システム(64ビットLinuxなど)がある64ビットデータモデルLP64とLLP64です。 32ビットintおよび64ビットlongこのため、整数型はすべてのプラットフォームで固定幅と見なすことはできません。

C ++ 11

固定幅の整数型が必要な場合は、 <cstdint>ヘッダーの型を使用しますが、標準では、実装では、 int8_tint16_tint32_tint64_tintptr_tuint8_tuint16_tuint32_tuint64_tおよびuintptr_t

C ++ 11

char16_tchar32_tサイズ

char16_tchar32_tのサイズは、 char16_tで規定されているように実装定義されており、3.9.1.5節で規定されている。

  • char16_tは、UTF-16コード単位を表すのに十分な大きさで、 uint_least16_tと同じサイズ、符号、および整列をuint_least16_tます。従って、少なくとも16ビットのサイズであることが要求される。

  • char32_tは、UTF-32コード単位を表すのに十分な大きさで、 uint_least32_tと同じサイズ、符号、および整列をuint_least32_tます。したがって、少なくとも32ビットのサイズであることが要求される。

bool大きさ

boolのサイズは実装定義であり、 1もなくてもよい。

wchar_tのサイズ

§3.9.1.5で指定されているwchar_tは、サポートされているロケールの中で最大の拡張文字セットのすべての個別コード単位を値の範囲で表すことができる特殊タイプです。これは、 基になる型として知られている他の整数型の1つと同じサイズ、符号、および整列を持ちます。この型のサイズは、5.3.3.1で規定されているように実装定義されており、例えば、少なくとも8,16、または32ビットであってもよい。たとえば、システムがUnicodeをサポートしている場合、 wchar_tは少なくとも32ビットでなければなりません(このルールの例外はWindowsですwchar_tは互換性のために16ビットです)。これはC90規格(ISO 9899:1990§4.1.5)から継承されたものであり、軽微な言い換えである。

実装に応じて、 wchar_tのサイズはwchar_t 、または32ビットであることがよくありますが、必ずしもそうであるとは限りません。これらの最も一般的な例は次のとおりです。

  • UnixおよびUnixライクなシステムでは、 wchar_tは32ビットで、通常はUTF-32で使用されます。
  • Windowsでは、 wchar_tは16ビットで、UTF-16で使用されます。
  • 8ビットのみをサポートするシステムでは、 wchar_tは8ビットです。
C ++ 11

Unicodeサポートが望まれる場合、使用することが推奨されるchar UTF-8の、 char16_t UTF-16、またはchar32_t代わりに使用する、UTF-32 wchar_t


データモデル

前述のように、整数型の幅はプラットフォームによって異なる場合があります。最も一般的なモデルは次のとおりです。サイズはビット単位で指定します。

モデル int long ポインタ
LP32(2/4/4) 16 32 32
ILP32(4/4/4) 32 32 32
LLP64(4/4/8) 32 32 64
LP64(4/8/8) 32 64 64

これらのモデルのうち、

  • 16ビットWindowsはLP32を使用しました。
  • 32ビット* nixシステム(Unix、Linux、Mac OSXなどのUnixライクなOS)とWindowsではILP32を使用しています。
  • 64ビットWindowsはLLP64を使用します。
  • 64ビット* nixシステムはLP64を使用します。

ただし、これらのモデルは、標準では特に言及されていません。

1バイトのビット数

C ++では、 バイトcharオブジェクトが占有する領域です。バイト内のビット数は、 CHAR_BITで定義され、少なくとも8である必要があるclimitsによって与えられます。ほとんどの現代システムは8ビットのバイトを持ち、POSIXではCHAR_BITが正確に8である必要がありますが、 CHAR_BIT 8より大きい、すなわち、単一バイトは、8,16,32、または64ビットから構成され得る。

ポインタの数値

reinterpret_castを使って整数へのポインタをキャストした結果は、実装定義ですが、 "...は、基礎となるマシンのアドレッシング構造を知っている人には驚かないことを意図しています。"

int x = 42;
int* p = &x;
long addr = reinterpret_cast<long>(p);
std::cout << addr << "\n"; // prints some numeric address,
                           // probably in the architecture's native address format

同様に、整数から変換されたポインタも実装定義されています。

ポインタを整数として格納する正しい方法は、 uintptr_t型またはintptr_t型を使用することです。

// `uintptr_t` was not in C++03. It's in C99, in <stdint.h>, as an optional type
#include <stdint.h>

uintptr_t uip;
C ++ 11
// There is an optional `std::uintptr_t` in C++11
#include <cstdint>

std::uintptr_t uip;

C ++ 11は、 uintptr_t (C99標準、6.3.2.3)の定義ではC99を指します。

voidへの有効なポインタをこの型に変換してからvoidへのポインタに変換し、その結果を元のポインタと比較するという性質を持つ符号なし整数型です。

現代のプラットフォームの大部分では、フラットなアドレス空間を想定することができますが、 uintptr_t算術演算はchar *算術演算と同等ですが、変換が可能な限り、 void *uintptr_tするときには、 uintptr_tからvoid *にキャストバックするときは逆にしてください。

技術

  • XSI準拠(X / Open System Interfaces)システムでは、 intptr_t型とuintptr_t型が必要です 。それ以外の場合はオプションです

  • C標準の意味では、関数はオブジェクトではありません。 uintptr_tが関数ポインタを保持できることがC標準によって保証されていません。とにかく、POSIX(2.12.3)の準拠には以下が必要です:

    すべての関数ポインタ型はvoid型ポインタと同じ表現を持たなければならない。関数ポインタをvoid *に変換しても、その表現を変更してはならない。そのような変換から生じたvoid *値は、明示的キャストを使用して情報を失うことなく元の関数ポインタ型に変換することができます。

  • C99§7.18.1:

    初期のuが存在しないか存在しない場合にのみ異なるtypedef名が定義されている場合、それらは6.2.5節に記述されている対応する符号付きおよび符号なし型を表すものとする。これらの対応する型のうちの1つを提供する実装は、他の型を提供しなければならない。

    uintptr_tは、符号付き整数で分かりやすいようにポインタのビットを処理したい場合に意味があります。

数値型の範囲

整数型の範囲は実装定義です。 <limits>ヘッダーは、すべての基本型の最小値と最大値を提供するstd::numeric_limits<T>テンプレートを提供します。これらの値は、 <climits>および(> = C ++ 11) <cinttypes>ヘッダーによってC標準によって提供される保証を満たしています。

  • std::numeric_limits<signed char>::min()SCHAR_MINと等しく、-127以下です。
  • std::numeric_limits<signed char>::max()SCHAR_MAXと等しく、127以上です。
  • std::numeric_limits<unsigned char>::max()UCHAR_MAXと等しく、これは255以上です。
  • std::numeric_limits<short>::min()SHRT_MINと等しく、 SHRT_MIN以下です。
  • std::numeric_limits<short>::max()SHRT_MAXと等しく、32767以上です。
  • std::numeric_limits<unsigned short>::max()USHRT_MAXと等しく、65535以上です。
  • std::numeric_limits<int>::min()INT_MINと等しく、 INT_MIN以下です。
  • std::numeric_limits<int>::max()INT_MAXと等しく、32767以上です。
  • std::numeric_limits<unsigned int>::max()UINT_MAXと等しく、65535以上です。
  • std::numeric_limits<long>::min()LONG_MINに等しく、-2147483647以下です。
  • std::numeric_limits<long>::max()LONG_MAXに等しく、2147483647以上です。
  • std::numeric_limits<unsigned long>::max()ULONG_MAXに等しく、4294967295以上です。
C ++ 11
  • std::numeric_limits<long long>::min()LLONG_MINに等しく、-9223372036854775807以下です。
  • std::numeric_limits<long long>::max()は、 LLONG_MAXと等しく、9223372036854775807以上です。
  • std::numeric_limits<unsigned long long>::max()ULLONG_MAXと等しく、これは18446744073709551615以上です。

浮動小数点型のためにTmax()しながら、最大の有限値であるmin()最小の正の正規化した値です。浮動小数点型には、実装定義でも、 <cfloat>ヘッダを使用してC標準によって提供される特定の保証を満たす追加メンバが用意されています。

  • メンバdigits10は、精度の小数点以下の桁数をdigits10ます。
    • std::numeric_limits<float>::digits10FLT_DIGと等しく、少なくとも6です。
    • std::numeric_limits<double>::digits10DBL_DIGに等しく、少なくとも10です。
    • std::numeric_limits<long double>::digits10LDBL_DIGに等しく、少なくとも10です。
  • メンバmin_exponent10は、最小の負のEであり、その結果、電力Eに対する10が正常である。
    • std::numeric_limits<float>::min_exponent10FLT_MIN_10_EXPに等しく、-37以下になります。
    • std::numeric_limits<double>::min_exponent10DBL_MIN_10_EXPに等しく、-37以下になります。 std::numeric_limits<long double>::min_exponent10LDBL_MIN_10_EXPに等しく、最大-37です。
  • メンバーmax_exponent10は、パワーEに対する10が有限であるような最大Eである。
    • std::numeric_limits<float>::max_exponent10FLT_MIN_10_EXPに等しく、少なくとも37です。
    • std::numeric_limits<double>::max_exponent10DBL_MIN_10_EXPに等しく、少なくとも37です。
    • std::numeric_limits<long double>::max_exponent10LDBL_MIN_10_EXPに等しく、少なくとも37です。
  • メンバーis_iec559が真の場合、そのタイプはIEC 559 / IEEE 754に準拠しているため、その範囲はその標準によって決定されます。

浮動小数点型の値表現

標準では、 long doublefloat以上の精度を提供するdouble以上の精度を提供する必要があります。そのlong doubleこと任意の値表すことができるdoubleしながら、表すことができるdouble任意の値表すことができるfloat表すことができます。ただし、表現の詳細は実装定義されています。

浮動小数点型T場合、 std::numeric_limits<T>::radixは、 Tの表現で使用されるstd::numeric_limits<T>::radix指定します。

std::numeric_limits<T>::is_iec559が真の場合、 Tの表現は、IEC 559 / IEEE 754で定義されているフォーマットの1つに一致します。

整数から符号付き整数への変換時にオーバーフローする

符号付き整数または符号なし整数のいずれかが符号付き整数型に変換され、その値が宛先型で表現できない場合、生成される値は実装定義です。例:

// Suppose that on this implementation, the range of signed char is -128 to +127 and
// the range of unsigned char is 0 to 255
int x = 12345;
signed char sc = x;   // sc has an implementation-defined value
unsigned char uc = x; // uc is initialized to 57 (i.e., 12345 modulo 256)

列挙型の基礎となる型(したがってサイズ)

スコープのない列挙型に対して基になる型が明示的に指定されていない場合は、実装定義の方法で決定されます。

enum E {
    RED,
    GREEN,
    BLUE,
};
using T = std::underlying_type<E>::type; // implementation-defined

しかし、 intunsigned int両方が列挙のすべての値を表すことができない場合を除いて、標準では列挙型の基になる型がintより大きくならないように要求しています。したがって、上記のコードでは、 Tintunsigned int 、またはshortですが、 long longではなく、いくつかの例を挙げることができます。

列挙型は基底型と同じサイズ( sizeofによって返される)を持つことに注意してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow