K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2180] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/07 01:01:42

こんにちは。 >汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように >扱われる、ということかなと思うのですが、この認識で合っているでしょうか? >Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か >変換処理が行われるわけではないと思っています。 汎整数拡張という機能は、charやshortの変数でも、式の中ではintに変換される、 という機能です。変数に格納された値を使う時にはintでも、変数のサイズは、 charやshortならintより小さいわけですから、メモリから値を取り出して (intと同じビット幅の)レジスタに乗せるときには汎整数拡張による変換処理が 入りますし、逆に(int型の)式の値をcharとかshortの変数に格納するときには、 逆の変換が必要です。 試してみました。 char_test.c #include <stdio.h> int char_test(void) { char char_var = 5; printf("%d", char_var); } int_test.c #include <stdio.h> int int_test(void) { int int_var = 5; printf("%d", int_var); } アセンブラ上の差異は以下です(Linuxでgcc -S)。 char_test.s movb $5, -1(%rbp) ← char_var = 5のところ movsbl -1(%rbp), %eax ← char_varの値をeaxレジスタに移動 int_test.s movl $5, -4(%rbp) ←int_var = 5のところ movl -4(%rbp), %eax ← int_varの値をeaxレジスタに移動 int_test.sでは、単に32ビットを移動するmovl命令が使われていますが、 char_test.sでは、5をchar_varに代入する際にはバイトでの移動命令movbが、 char_varの値を取り出すときにはバイトを32ビットに変換しつつ移動する movsblが使われていることがわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]