有一个寄存器,其中包含一个字符串。我不明白完成以下说明时发生的隐式转换。
##The following commands are all done in gdb
Set $r12="CS21"
print *$r12 -> 825381699
Set $r12="C"
print *$r12 -> 67 #ascii value of C,ok there is a clue here
Set $r12 = "CS"
print *$r12 -> 21315 #now I am not so sure
我尝试了一些解释,例如“CS”= 0x6783、“CS”= 0x4353 将它们转换为整数,但我无法获取上面的值。转换是如何发生的?
在这种情况下,字符串被转换为字节,并且这些字节根据小端顺序组合成整数。
对于第一个,我们得到了一个字符串
CS21
。它将像这样存储在寄存器中:
Bytes order 3 2 1 0
Char 1 2 S C
ASCII in hex 31 32 53 43
这样我们就得到了一个十六进制整数
0x31325343
,十进制就是825381699。
对于第三个,我们得到了一个字符串“CS”。同样,它会像这样存储在寄存器中:
Bytes order 3 2 1 0
Char S C
ASCII in hex 53 43
这样我们就得到了一个十六进制整数
0x5343
,十进制就是21315。
对于问题的解释:
0x6783
显然是不合适的。 67
和83
是C
和S
的十进制ASCII,它们不应该放在一起作为十六进制。0x4353
非常接近正确的解释。但本例中使用的是小端顺序,这意味着第一个字符应放置在最低位置。