83207


先日TypeScriptのUnion型からC言語の共用体の動作が納得できたという会話がありました。

TypescriptのUnion型は

> TypeScriptのユニオン型(union type)は「いずれかの型」を表現するものです。

<https://book.yyts.org/reference/values-types-variables/union>

であり、

C言語のUnion型が

> 共用体（きょうようたい、英: union）は、プログラミング言語におけるデータ型の一つで、同じメモリ領域を複数の型が共有する構造である。

<https://ja.wikipedia.org/wiki/%E5%85%B1%E7%94%A8%E4%BD%93>

であるとしらべた結果分かりました。これをみると、同じメモリ領域を複数の型が共有する構造がTypescriptでは成立しないと思いますが、これらの2つのUnion型は同一の（Wikipediaに書かれているような共用体）ものと考えて良ろしいでしょうか？


CC BY-SA 4.0
2021-10-21T19:44:29.700
83206
2021-10-22T14:57:12.593
45076
question
typescript
TypescriptのUnion型はC言語などと同じく共用体ですか？


二者は異なるものと考えて差し支えないです。

TypeScript の Union 型はあくまで型レベルで複数の型のいずれかであることを示すものであり、Intersection 型と対比される存在です。

一方 C
言語の共用体は、ひとつのメモリ領域に複数の型の中からいずれかの型の値を保持するための仕組みです。また、同じメモリ領域を参照しつつ、列挙されている複数の型のいずれかとしてそのメモリ領域を解釈した値を得ることができます。つまり共用体は「メモリ領域を
A という型の値として解釈したり B という型の値として解釈したり好きに決められる」というように使えるものであり、TypeScript の Union
型のように「A という型の値が得られるか B という型の値が得られるかのどちらか一方ができる」というようなものではありません。また TypeScript
ではメモリ上の表現について何も決めていません。

したがって両者は、似たようなセンスを持っているモノではありますが、実用上は異なるものと考えて差し支えないです。


CC BY-SA 4.0
2021-10-21T23:46:11.667
83207
2021-10-22T14:57:12.593
2021-10-22T14:57:12.593
19110
19110
83206
answer


オイラ typescript は全く知らないので C/C++ と typescript を比較することはできませんが
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") 言語仕様書は手元にあるので引用はいいんよう

[c](/questions/tagged/c "'c' のタグが付いた質問を表示") 言語仕様書 JIS X3010:2003 6.7.2.1
構造体指定子及び共用体指定子

> どんなときでも、高々一つのメンバの値だけが共用体オブジェクトに格納できる。

[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") 言語仕様書 JIS X3014:2003 9.5
共用体

> 共用体では、どの時点をとっても、高々一つのデータメンバしか活性化できない。すなわち、ある時点で共用体に格納できるのは、高々一つのメンバの値とする。

この文言の意味は、例えば下記サンプルは共用体のあるメンバに値を格納して別のメンバから異なる形式で取り出すことが可能でなければならないのですが

[code]

    union mytest_type {
        int member32;
        char member8[4];
    }; // があるとき
    union mytest_type u; // に対して
    u.member32=0x1234abcd; // のように格納して
    u.member8[0]==0x12 && u.member8[1]==0x34 // 以下略になることが期待されていたり
    u.member8[0]==0xcd && u.member8[1]==0xab // 以下略になることが期待されていたり
    // これをもって Little-Endian Big-Endian の判断とする
    
[/code]

言語仕様書はそんなことが可能であるとは一言も主張していないということです。まあ現実的には C/C++ ではそういうことが可能な処理系ばかりなのですが。

提示された typescript の挙動を見るに typescript
の共用体は最後に格納された値の種類を覚えていて、今何が格納されているかチェックできるようですね。でも [c](/questions/tagged/c
"'c' のタグが付いた質問を表示")
は超絶古い言語で、その当時のコンピュータにそんな複雑なことはできない（っつかさせるとメモリを食って速度も落ちることが見え見えな）ので最後に何を格納したかを言語処理系・ランタイムライブラリは一切管理しません。管理するのはプログラマの仕事です。その意味ですでに回答がある通り全く別物と考えてよさそうです。


CC BY-SA 4.0
2021-10-22T13:12:13.150
83221
2021-10-22T13:12:13.150
8589
83206
answer