掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26030

型変換
投稿者---io(2006/02/08 15:13:40)


こんにちは、いつもお世話になります。
型変換に関して伺いたいですが、よろしくお願いします。

(整数型 char, short, int, long, long long 間の変換 [C99, 6.3.1.3]
変換先の型で元の値を表すことができる場合,その値となる。
できない場合,もし変換先の型が符号なし(unsigned を付している)ならば,変換先の型で許された範囲に収まるまで変換先の型の最大値に1を足した値を繰り返し足して(あるいは引いて)ゆく。
それ以外は処理系に依存。)の中で

(できない場合,もし変換先の型が符号なし(unsigned を付している)ならば,変換先の型で許された範囲に収まるまで変換先の型の最大値に1を足した値を繰り返し足して(あるいは引いて)ゆく。 )
これは何の意味ですか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:型変換 26031 円零 2006/02/08 17:39:06
<子記事> Re:型変換 26032 YuO 2006/02/08 17:51:20


No.26031

Re:型変換
投稿者---円零(2006/02/08 17:39:06)


例えば、2ビットの整数型と4ビットの整数型があったとします。
後者から前者に型変換する場合、
つまり変換元が4ビット、変換先が2ビットの場合、
「変換先の型で元の値を表すことができない場合」となります。
ここで、もし変換先がunsignedであれば、
「変換先の型の最大値」は3、それに「1を足した値」は4ですね。
つまり、変換元の値に4を何回か足すか引くかして、上手く変換先の型に納まるようにするのです。
例えば変換元が-7なら、4を2回足せば1になります。
変換先の値の範囲は4個なので、4の加減によって飛び越すことはありません。

 unsignedsigned
2進数4bit2bit4bit2bit
0〜150〜3-8〜7-2〜1
00000000
00011111
0010222-2
0011333-1
01004040
01015151
0110626-2
0111737-1
100080-80
100191-71
1010102-6-2
1011113-5-1
1100120-40
1101131-31
1110142-2-2
1111153-1-1

要するに、2ビットの整数にそれより大きな整数を入れると言うことは
変換元が xxx...x** であれば ** を取り出すと言うことであり、3ビット目より上を全部捨てると言うことです。
ここで「変換先の型の最大値に1を足した値」=4は2進法で"100"ですから、
要は xxx...x から1を引き続ける、ないし足し続けてこれを 000...0 にセットすると言うことになります。
10進法で言えば、123456の下二桁を得るために100を1234回引くのと同じことですね。


この投稿にコメントする

削除パスワード

No.26033

Re:型変換
投稿者---io(2006/02/08 18:37:05)


>例えば、2ビットの整数型と4ビットの整数型があったとします。
>後者から前者に型変換する場合、
>つまり変換元が4ビット、変換先が2ビットの場合、
>「変換先の型で元の値を表すことができない場合」となります。
>ここで、もし変換先がunsignedであれば、
>「変換先の型の最大値」は3、それに「1を足した値」は4ですね。
>つまり、変換元の値に4を何回か足すか引くかして、上手く変換先の型に納まるようにするのです。
>例えば変換元が-7なら、4を2回足せば1になります。
>変換先の値の範囲は4個なので、4の加減によって飛び越すことはありません。
>
>
 unsignedsigned
2進数4bit2bit4bit2bit
0〜150〜3-8〜7-2〜1
00000000
00011111
0010222-2
0011333-1
01004040
01015151
0110626-2
0111737-1
100080-80
100191-71
1010102-6-2
1011113-5-1
1100120-40
1101131-31
1110142-2-2
1111153-1-1

>要するに、2ビットの整数にそれより大きな整数を入れると言うことは
>変換元が xxx...x** であれば ** を取り出すと言うことであり、3ビット目より上を全部捨てると言うことです。
>ここで「変換先の型の最大値に1を足した値」=4は2進法で"100"ですから、
>要は xxx...x から1を引き続ける、ないし足し続けてこれを 000...0 にセットすると言うことになります。
>10進法で言えば、123456の下二桁を得るために100を1234回引くのと同じことですね。




円零様、YuO様;
 返事ありがとうございます。
<ここで、もし変換先がunsignedであれば、
「変換先の型の最大値」は3、それに「1を足した値」は4ですね。
つまり、変換元の値に4を何回か足すか引くかして、上手く変換先の型に納まるようにするのです。
例えば変換元が-7なら、4を2回足せば1になります。
変換先の値の範囲は4個なので、4の加減によって飛び越すことはありません>


この辺意味分かりません。もっとお願いしてもよろしいでしょうか?


この投稿にコメントする

削除パスワード

No.26034

Re:型変換
投稿者---円零(2006/02/08 18:48:43)


>>変換先の値の範囲は4個なので、4の加減によって飛び越すことはありません
>
>この辺意味分かりません。もっとお願いしてもよろしいでしょうか?

4以上の数から4を引いて0未満になることはないし、
0未満の数に4を足して3を越えることはない、
つまり4を足し続けるか引き続けるかすれば必ず0から3の範囲内の値にたどり着ける、と言う意味です。

まあわかりにくかったら無視してください。
私の説明は2ビット・4ビットの表に尽きるので、それ以外の文章は蛇足です。


この投稿にコメントする

削除パスワード

No.26035

Re:型変換
投稿者---Hermit(2006/02/08 19:46:42)


円零さんの例で言うと、
4 ビット表現の数を 2 ビットで表現しようとしても、
上位の 2 ビット分は表現できないので、
上位 2 ビットが 0 になるまで足していき、
下位 2 ビットのみの数値にするという事でしょう。

1010 ...(1)
xxoo
0010 ...(2)

(1) の数値で、xx の所があると 2 bit で表現できないので、
そこの部分が 00 になるまで数値 0100 を足すか引くかして、
最終的に (2) の様に 2 bit で表現できる数値にする。
で表現できるようになった数値を、2 bit 値に代入する。

言葉にすれば、そんな感じですが、
普通同等の処理として 表現できない xx の部分を そのまま 0 にし(マスクする)
表現できる oo の部分だけにする、と思った方がいいと思います。

でわかるかな・・・
説明の練習がてら書いてみました。


この投稿にコメントする

削除パスワード

No.26036

Re:型変換
投稿者---io(2006/02/09 09:54:37)


>円零さんの例で言うと、
>4 ビット表現の数を 2 ビットで表現しようとしても、
>上位の 2 ビット分は表現できないので、
>上位 2 ビットが 0 になるまで足していき、
>下位 2 ビットのみの数値にするという事でしょう。
>
>1010 ...(1)
>xxoo







>0010 ...(2)
>
>(1) の数値で、xx の所があると 2 bit で表現できないので、
>そこの部分が 00 になるまで数値 0100 を足すか引くかして、
>最終的に (2) の様に 2 bit で表現できる数値にする。
>で表現できるようになった数値を、2 bit 値に代入する。
>
>言葉にすれば、そんな感じですが、
>普通同等の処理として 表現できない xx の部分を そのまま 0 にし(マスクする)
>表現できる oo の部分だけにする、と思った方がいいと思います。
>
>でわかるかな・・・
>説明の練習がてら書いてみました。


ありがとうございます。何とかわかりました。また困ったらお願いします。どうもです。


この投稿にコメントする

削除パスワード

No.26032

Re:型変換
投稿者---YuO(2006/02/08 17:51:20)


>(できない場合,もし変換先の型が符号なし(unsigned を付している)ならば,変換先の型で許された範囲に収まるまで変換先の型の最大値に1を足した値を繰り返し足して(あるいは引いて)ゆく。 )
>これは何の意味ですか?

これは,変換先の型が変換元の型よりも小さい場合の話です。

変換元の型:T (符号付きまたは符号無しの整数型)
変換先の型:U (符号無しの整数型)
変換先の型の最大値:Umax

としたときに,
U Convert (T value)
{
     while (value < 0) {
         value += (Umax + 1);
     }
     while (value > Umax) {
         value -= (Umax + 1);
     }
     return (U)value;
}

というコードと同じような振る舞いをする,ということになります。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧