[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が使われていることがわかります。