栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于类型转换的问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于类型转换的问题

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 = %dn”,
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的值了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232231.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号