为了账号安全,请及时绑定邮箱和手机立即绑定

关于类型转换的问题

标签:
C++

int main( int argc, char **argv) // char **argv -> char *argv[]
{
char *ip_adrs = argv[1];
unsigned short unit = (short)(argv[2]);
unsigned short reg_no = (short)(argv[3]);
unsigned short num_regs = (short)(argv[4]);

printf(“ip_adrs = %s unit = %d reg_no = %d num_regs = %d\n”,
ip_adrs, unit, reg_no, num_regs);

}
对以上程序运行后,打印以下结果:图片描述
前面都好理解,unit为字符5的ascii码,reg_no为字符0的ascii码,但对于num regs的值感到很困惑,不理解12337是什么值,为什么字符10会打印出12337
为了排查问题,添加以下代码:

cout << typeid(argv[2]).name() << endl; type: char *
cout << typeid(argv[3]).name() << endl; // type: char *
cout << typeid(argv[4]).name() << endl; // type: char *

以上看出,argv[]中的元素都是指向字符的指针,既然指向字符,那么指向内容占一个字节,若此时打印argv[4]内容,可以看到以下结果: 图片描述
也就是argv[4]本来指向的是ascii码的字符1,那为何转换成short后变成了12337呢,分析这个问题,添加了以下代码:
cout << typeid(num_regs).name() << endl; // type: unsigned short
cout << sizeof(num_regs) << endl; // size: 2
以上可以看出num_regs是占两个字节的short类型,也就是argv[4]被强制转换为了指向两个字节的指针, 本来*argv[4] = 0x31 *argv[4]+1 = 0x30,现在变成了
*argv[4] = 0x3031,因此打印num_regs的值就是0x3031的值了

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消