Type_conversion
航空ライセンスプロセスについては、型変換(航空)を参照してください
「型変換」
コンピュータサイエンス、型変換、 型鋳造、〜 型の強制、とタイプジャグリング 変更のさまざまな方法である発現を一方からデータ・タイプ別に。例としては、整数値を浮動小数点値に変換したり、文字列としてのテキスト表現に変換したり、その逆を行ったりします。型変換では、型階層またはデータ表現の特定の機能を利用できます。型変換の2つの重要な側面は、暗黙的に(自動的に)または明示的に行われるか 、および基になるデータ表現が1つの表現から別の表現に変換されるか、または特定の表現が単に別の表現として再解釈されるかです。データ・タイプ。 一般に、プリミティブデータ型と複合データ型の両方を変換できます。
各プログラミング言語には、型の変換方法に関する独自のルールが強い型付けの言語は通常、暗黙の変換をほとんど行わず、表現の再解釈を思いとどまらせますが、弱い型付けの言語は、データ型間で多くの暗黙の変換を実行します。弱い型付け言語では、コンパイラーにデータ項目を異なる表現を持つものとして任意に解釈させることがよくこれは、自明ではないプログラミングエラー、または基盤となるハードウェアを直接処理する技術的な方法である可能性が
ほとんどの言語では、強制という言葉は、コンパイル中または実行時のいずれかで、暗黙の変換を示すために使用されます。たとえば、整数と浮動小数点数(5 + 0.1など)が混在する式では、コンパイラは整数表現を浮動小数点表現に自動的に変換するため、分数が失われることはありません。明示的な型変換は、追加のコードを記述する(たとえば、型識別子の追加や組み込みルーチンの呼び出し)か、型の不一致で停止する場合にコンパイラーが使用する変換ルーチンをコーディングすることによって示されます。
Pascal、Modula-2、Ada、DelphiなどのほとんどのALGOLに似た言語では、変換とキャストは明らかに異なる概念です。これらの言語では、変換とは、値をあるデータ型ストレージ形式から別のデータ型ストレージ形式(16ビット整数から32ビット整数など)に暗黙的または明示的に変更することを指します。変換の結果として、精度の低下や切り捨てなど、ストレージのニーズが変わる可能性が一方、キャストという言葉は、値を表すビットパターンの解釈をあるタイプから別のタイプに明示的に変更することを指します。たとえば、32個の連続するビットは、32個のブール値の配列、4バイトの文字列、符号なし32ビット整数、またはIEEE単精度浮動小数点値として扱うことができます。格納されたビットは変更されないため、プログラマーは、意味のあるキャストを行うために、表現形式、バイト順序、配置の必要性などの低レベルの詳細を知っている必要が
C言語ファミリーとALGOL68では、キャストという単語は通常、(暗黙的な変換ではなく)明示的な型変換を指し、これがビットパターンの再解釈なのか実際のデータ表現なのかについてあいまいさを引き起こします。会話。さらに重要なのは、ポインターによって配置されるデータ型(またはクラス)に適用される多数の方法と規則、およびオブジェクト(クラス)の継承などの場合にコンパイラーがポインターを調整する方法です。
コンテンツ
1 言語比較1.1.1 暗黙の型変換
1.1.1.1 タイププロモーション
1.1.2 明示的な型変換
1.2 C#およびC ++ 1.3 エッフェル
1.3.1 Eiffelでの型変換の定義
1.3.2 例
1.4 さび
2 セキュリティ上の問題
3 も参照してください
4 参考文献
5 外部リンク
言語比較
Cのような言語編集
暗黙の型変換
強制型とも呼ばれる暗黙的な型変換は、コンパイラによる自動型変換です。一部のプログラミング言語では、コンパイラが強制を提供できます。他の人はそれを必要とします。
混合型式では、プログラムが正しく実行されるように、実行時に必要に応じて1つ以上のサブタイプのデータをスーパータイプに変換できます。たとえば、以下は有効なC言語コードです。
ダブルd ; 長いl ; int i ; if (d > i )d = i ;
if (i > l )l = i ;
if (d == l )d * = 2 ; がD、 L、及び
iは異なるデータタイプに属し、それらは自動的に同じデータ型に比較または割り当てが実行されるたびに変換されます。意図しない結果が生じる可能性があるため、この動作は注意して使用する必要が表現を浮動小数点から整数に変換すると、浮動小数点値の小数部が切り捨てられる(ゼロに丸められる)ため、データが失われる可能性が逆に、浮動小数点型は整数型を正確に表すことができない場合があるため、表現を整数から浮動小数点に変換するときに精度が失われる可能性がたとえば、IEEE 754単精度型の場合、整数16777217を正確に表すことはできませんが、32ビット整数型は表すことができます。これは、次のコードで示されているように、直感的でない動作につながる可能性がfloat
#include
float f_value = 16777216.0 ;
printf (”整数は次のとおりです:%d n ” 、i_value ); printf (”フロートは次のとおりです:%f n ” 、f_value ); printf (”それらの等式:%d n ” 、i_value == f_value ); }
floatをIEEE単精度として実装し、intを少なくとも32ビットとして実装するコンパイラでは、このコードは次のような独特の出力を提供します。
整数は次のとおりです:16777217フロートは:16777216.000000それらの平等:1
1は、上記の最後の行の同等性を表すことに注意してこの奇妙な振る舞いは、と比較したときにfloatに暗黙的に変換されることによって発生します。変換すると精度が低下し、比較前の値が等しくなります。i_valuef_value
重要なポイント:
float切り捨て、つまり小数部分の削除を引き起こします。int
double桁の丸めを引き起こします。float
long過剰な上位ビットのドロップを引き起こします。int
タイププロモーション
暗黙的な型変換の特殊なケースの1つは、型の昇格です。この場合、コンパイラは整数型または浮動小数点型のオブジェクトのバイナリ表現を自動的に拡張します。プロモーションは通常、算術演算および論理演算の前に、ターゲットプラットフォームの算術論理演算装置(ALU)のネイティブ型よりも小さい型で使用され、そのような演算を可能にします。ALUが複数の型で動作できる場合はより効率的です。CおよびC ++は、intにプロモートされるブール型、文字、ワイド文字、列挙型、および短整数型のオブジェクト、およびdoubleにプロモートされるfloat型のオブジェクトに対してこのようなプロモートを実行します。他のいくつかの型変換とは異なり、プロモーションは精度を失ったり、オブジェクトに格納されている値を変更したりすることはありません。 Java: int x = 3 ; ダブル y = 3.5 ; システム。アウト。println (x + y ); //出力は6.5になります
明示的な型変換
明示的な型変換は、プログラム内で明示的に定義される型変換です(暗黙的な型変換のためにコンパイラーによって実行されるのではありません)。これは、プログラム内のユーザーによって定義されます。
double da = 3.3 ; double db = 3.3 ; ダブルDC = 3.4 ; int result = (int )da + (int )db + (int )dc ; // result == 9 //暗黙の変換が使用される場合( “result = da + db + dc”の場合のように)、resultは10に等しくなります
明示的な変換にはいくつかの種類が
チェック済み
変換が実行される前に、実行時チェックが実行され、宛先タイプがソース値を保持できるかどうかが確認されます。そうでない場合、エラー状態が発生します。
チェックされていない
チェックは実行されません。宛先タイプがソース値を保持できない場合、結果は未定義です。
ビットパターン
ソースの生のビット表現は逐語的にコピーされ、宛先タイプに従って再解釈されます。これは、エイリアシングを介して実現することもでき でオブジェクト指向プログラミング言語、オブジェクトをすることもできるダウンキャスト :基本クラスの参照は、その派生クラスのいずれかにキャストされます。
C#およびC ++
ではC# 、型変換は、方法(すなわち、C-など)安全か危険な中で行うことができ、呼ばれる前者は型キャストをチェックします。
動物 動物 = 新しい 猫();ブルドッグ b = (ブルドッグ) 動物; //(animal is Bulldog)の場合、stat.type(animal)はBulldogです。それ以外の場合、例外b = animal as Bulldog ;
// if(animal is Bulldog)、b =(Bulldog)animal、else b = null動物 = null ; b = ブルドッグとしての動物 ; // b == null
ではC ++と同様の効果が使用して達成することができるスタイルのキャスト構文- C ++を。
動物*動物=新しい猫; ブルドッグ* b = static_cast <ブルドッグ*> (動物); // AnimalまたはBulldogのいずれかが他の(または同じ)から派生している場合にのみコンパイルしますb = dynamic_cast < Bulldog *> (animal ); // if(animal is Bulldog)、b =(Bulldog *)animal、else b = nullptr
ブルドッグ&br = static_cast <ブルドッグ&> (*動物); //上記と同じですが、nullptrが返される場合は例外がスローされます//これは例外処理が回避されるコードでは見られませんanimal = nullptr ;
b = dynamic_cast <ブルドッグ*> (動物); // b == nullptr
動物を削除します; //常にリソースを解放します
エッフェル
エッフェル型変換の概念は、型システムの規則に組み込まれています。割り当てルールでは、次のような割り当てが示されています。
x := y
ソース式のタイプ(yこの場合)がターゲットエンティティのタイプ(この場合)と互換性がある場合にのみ有効ですx。このルールでは、互換性があるとは、ソース式のタイプがターゲットのタイプに準拠または変換されることを意味します。型の適合性は、オブジェクト指向プログラミングにおけるポリモーフィズムのよく知られた規則によって定義されます。たとえば、上記の割り当てでは、のタイプは、基になっているクラスが基になっているクラスの子孫である場合のタイプにy準拠しています。xyx
Eiffelでの型変換の定義
エッフェル塔に型変換の作用は、特異的に変換さとから変換は、のように定義されます。
クラスのCUに基づいてタイプに変換クラスCT(及びTに基づいて、型Tから変換U)のいずれかであれば
CTには、変換タイプとしてUを使用
する
変換手順が
CUには、変換タイプとしてTをリスト
する
変換クエリがあります
例
Eiffelは、Microsoft .NETFrameworkに完全に準拠した言語です。.NETが開発される前は、Eiffelにはすでに広範なクラスライブラリがありました。特に文字列などの一般的に使用される型で.NET型ライブラリを使用すると、変換の問題が発生します。既存のEiffelソフトウェアはEiffelライブラリの文字列クラス(など)を使用しますが、.NET用に作成されたEiffelソフトウェアは、多くの場合、たとえば.NETのアイテムを期待する.NETメソッドを呼び出すときに.NET文字列クラス()を使用する必要が引数として渡されるタイプ。したがって、これらのタイプの相互変換は、可能な限りシームレスである必要がSTRING_8System.String
my_string : STRING_8-
ネイティブEiffel文字列 my_system_string : SYSTEM_STRING- ネイティブ.NET文字列
..。
my_string := my_system_string
上記のコードでは、2つの文字列が宣言されています。1つはそれぞれ異なるタイプです(SYSTEM_STRINGSystem.StringのEiffel準拠のエイリアスです)。にSystem.String準拠していないためSTRING_8、上記の割り当てはにSystem.String変換された場合にのみ有効ですSTRING_8。
EiffelクラスにSTRING_8は、make_from_cilタイプがのオブジェクトの変換プロシージャがありますSystem.String。変換手順も常に作成手順として指定されます(コンストラクターと同様)。以下は、STRING_8クラスからの抜粋です。 class STRING_8 … create make_from_cil … convert
make_from_cil ({ SYSTEM_STRING })
..。
変換手順が存在すると、割り当てが行われます。
my_string := my_system_string
意味的に同等:
my_stringを作成します。make_from_cil (my_system_string )
ここでmy_stringはSTRING_8、のコンテンツと同等のコンテンツを持つタイプの新しいオブジェクトとして構築されますmy_system_string。
元のソースとターゲットを逆にして割り当てを処理するには:
my_system_string := my_string
このクラスSTRING_8には、のインスタンスからto_cilを生成する変換クエリも含まSystem.StringれていますSTRING_8。 class STRING_8 … create make_from_cil … convert
make_from_cil ({ SYSTEM_STRING })
to_cil : { SYSTEM_STRING }
.. ..
割り当て:
my_system_string := my_string
次に、次と同等になります。
my_system_string := my_string 。to_cil
Eiffelでは、型変換のセットアップはクラスコードに含まれていますが、クライアントコードでの明示的な型変換と同じように自動的に行われるように見えます。には、割り当てだけでなく、引数(パラメーター)の置換などの他のタイプの添付ファイルも含まれます。
さび
Rustは、プリミティブ型間の暗黙的な型変換(強制)を提供しません。ただし、asキーワードを使用して明示的な型変換(キャスト)を実行できます。
println!(”1000 as a u16 is:{}” 、1000 as u16 );
セキュリティ上の問題
でハッキング、型キャストは、一時的に変更するには、型変換の誤用である変数、それが最初に定義された方法からのデータ・タイプを。これは、変数が「型キャスト」された後の型変換で別のデータ型になるため、ハッカーに機会を提供します。コンパイラは、ハッキングされた変数をその特定の操作の新しいデータ型として扱います。
も参照してください
ダウンキャスティング
実行時型情報#動的キャストとJavaキャスト
型のパンニング
参考文献
^ Mehrotra、Dheeraj(2008)。S.チャンドのコンピュータサイエンス。pp。81–83。ISBN 978-8121929844。
^ プログラミング言語-設計と構築。2013.p。35. ISBN 978-9381159415。
^ Reilly、Edwin(2004)。コンピュータサイエンスの簡潔な百科事典。PP。 82、110。ISBN 0470090952。
^ フェントン、スティーブ(2017)。Pro TypeScript:アプリケーションスケールのJavaScript開発。pp。xxiii。ISBN 978-1484232491。
^ 「PHP:型ジャグリング-手動」。php.net 。
^ Olsson、Mikael(2013)。C ++クイック構文リファレンス。pp。87–89。ISBN 978-1430262770。
^ クルーゼ、ルドルフ; ボーゲルト、クリスチャン; ブラウン、クリスチャン; モスタギム、サナズ; Steinbrecher、Matthias(2016年9月16日)。計算知能:方法論の紹介。NS。269. ISBN 978-1447172963。
^ Mössenböck、Hanspeter(2002年3月25日)。「高度なC#:チェックされた型キャスト」(PDF)。InstitutfürSystemsoftware、JohannesKeplerUniversitätLinz、FachbereichInformatik。NS。5 。
で、C#のチュートリアル ^ 「キャスティング-RustByExample」。doc.rust-lang.org。
^ Jon Erickson Hacking、第2版:The Art of Exploitation 2008 1593271441 p51「型キャストは、変数が最初に定義された方法に関係なく、変数のデータ型を一時的に変更する方法です。変数が別の型に型キャストされる場合、コンパイラは基本的にその変数を新しいデータ型であるかのように扱うように指示されましたが、その操作に対してのみです。型キャストの構文は次のとおりです:(typecast_data_type)variable … ” ^ Arpita Gopal Magnifying C 2009 8120338618p。59 “上記から、型キャストの使用法は、あるタイプの変数を作成し、1回の操作で別のタイプのように動作することです。したがって、この型キャスト機能を使用することにより、整数を型キャストすることでASCII文字を作成できます。これは …”
外部リンク
エイダでのキャスティング
C ++でのキャスト
C ++リファレンスガイドDannyKalevによるC ++キャスト演算子が嫌いな理由
Javaでのキャスト
C#での暗黙的な変換
Cppreference.comでの暗黙的な型キャスト
C ++での静的および再解釈のキャスト
F#でのアップキャストとダウンキャスト