キースの答えは私の質問の精神に沿ったものですが、アレックスの要求に従って、私はこれを自分で試してみようと思いました。
興味深いことに、この場合、私の例に対するより文字通りの答えは「ゴミ」です。
#include <stdio.h>
int iMysteryMeat(short x)
{
return *((int *)&x);
}
unsigned uMysteryMeat(unsigned short x)
{
return *((unsigned *)&x);
}
int main()
{
printf("iMeat: 0x%08x\n", iMysteryMeat(-23));
printf("uMeat: 0x%08x\n", uMysteryMeat(-23));
return 0;
}
gcc -m32 -S meat.c
iMysteryMeat:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movw %ax, -4(%ebp)
leal -4(%ebp), %eax
movl (%eax), %eax
leave
ret
uMysteryMeat:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movw %ax, -4(%ebp)
leal -4(%ebp), %eax
movl (%eax), %eax
leave
ret
./a.out
iMeat: 0x0804ffe9
uMeat: 0x0043ffe9
ご覧のとおり、通常の符号拡張プロトコルがオーバーライドされるだけでなく(つまり、Keithのものと比較してa()
)、実際にはxが初期化されていないスタックスペースに移動されmovw
、戻り値の上半分が何main()
を与えてもガベージになります。
したがって、繰り返しになりますが、ouahが言ったように、これをCで行うことは決してなく、アセンブリ(または一般的には実際)では、常に入力を滅菌してください。