たとえば、Javaの実数は8バイトですが、C++の実数は4バイトしかかかりません。同様に、文字の場合、Javaは2バイトを使用しますが、C++は1バイトしか使用しません。なぜサイズが違うのですか?
7 に答える
あなたが言っていることは真実ではありません。CおよびC++には、固定サイズの型はありません(で指定されたものを除くstdint.h
)。
そして、あなたがその声明からあなたに答えを得なかったならば、ここに明白なものがあります:
「Javaには固定サイズのデータ型が含まれているのに対し、CおよびC ++のすべての基本的なデータ型は、プログラムがコンパイルされる実際のプラットフォーム(マシンアーキテクチャ+オペレーティングシステム)に依存するため、違いがあります。」
まず、C ++の型の実際のサイズは実装に依存しますが(char
9ビットの実装もあります)、両方の言語をサポートするほとんどのプラットフォームで、C++float
とdouble
Javaの両方でまったく同じサイズになります。
に関してはchar
、Javaタイプchar
は多かれ少なかれ
wchar_t
C++に対応しています。論理的には、ほとんどのプラットフォームでは4バイトである必要がありますが、さまざまな歴史的理由から、Windows、AIX、およびJavaランタイム環境では2バイトにすぎません。
char
Javaには、C++タイプに相当するものはありません。
c++はプラットフォームに依存しています。たとえば、-intはワードのサイズになります-32ビットまたは64ビットは、コンピュータの新しさによって異なります。
javaははるかに一般的です-サイズを定義するJVM上で実行されます。C#の場合と同じです。どちらも、使用しているOSとCPUに依存しません。
C++タイプのサイズは石で設定されていません。規格によると(3.9.1基本タイプ):
文字(char)として宣言されたオブジェクトは、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければなりません。
それとその後:
標準の符号付き整数型には、「signed char」、「short int」、「int」、「long int」、および「longlongint」の5つがあります。このリストでは、各タイプは、リスト内でその前にあるものと少なくとも同じ量のストレージを提供します。
<...>
浮動小数点のタイプには、float、double、およびlongdoubleの3つがあります。型doubleは、少なくともfloatと同じ精度を提供し、型long doubleは、少なくともdoubleと同じ精度を提供します。
ご覧のとおり、正確な値は記載されていません。
CおよびC++には多くのタイプのサイズが定義されていませんが、通常float
はJavaと同様に4バイトであり、Javaと同様にdouble
8バイトです。Cには標準のバイトタイプがありません。
char
Cでは1バイトですが、符号付きまたは符号なしであることが保証されていません。Javaでは2バイトであり、0〜65535の文字をサポートするように署名されていることが保証されています。
ここでの違いは、サポートする必要があるのは7ビットASCIIだけのCが設計されていることです。Javaは、16ビット文字で十分と思われるときに設計されました。皮肉なことに、Unicodeは65535を超えないため、Javaは複数char
のコードポイントを使用するコードポイントもサポートするようになりました。
設計された言語が異なるデフォルト表現を使用することを選択しただけです。それ以上に複雑なものはありません。
char
たとえば、Javaでのサイズは、16ビットのUnicode文字(2バイトが必要)を使用したいという願望によって動機付けられました。これは、いくつかのトレードオフのバランスをとった設計上の決定です。
- (C / C ++のように)8ビット文字を使用することもできますが、その場合、かなりの数の有用なUnicode文字が1つの文字に収まりません。
- 32ビット文字を使用して、将来さらに多くの文字を許可することもできます(UTF32を想定)。しかし、それらのビットの多くはほとんどの場合無駄になります
Javaでは4バイトの浮動小数点数を使用できることに注意してください。これは(8バイト)のfloat
代わりに呼び出されます。double