继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

关于类型转换的问题

weixin_慕粉3137844
关注TA
已关注
手记 1
粉丝 0
获赞 1

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的值了

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP