面试题求解...

ft86281817 2009-05-25 02:30:19
1、const char *sz =“123”; 怎么转换成整形;
2、 main()
{
char *sz = "0123456789";
int *p = (int*)sz;
printf("%x\n",*++p);
} 字符’0‘对应的十六进制是0x30,请问程序输出是多少???


请大家帮分析下。。详细点。
...全文
436 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzh9955 2009-05-27
  • 打赏
  • 举报
回复
ATOI
某某9 2009-05-27
  • 打赏
  • 举报
回复
学习了
acrobatyuer 2009-05-27
  • 打赏
  • 举报
回复
深刻学习了。。。
zwd2005 2009-05-26
  • 打赏
  • 举报
回复
mark
rainbow_free 2009-05-26
  • 打赏
  • 举报
回复
mark!
amossavez 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ft86281817 的回复:]
引用 2 楼 wangpingfang 的回复:
1.使用atoi应该就可以了。
2.对于第二题,主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,…
[/Quote]
你用的什么编译器呀???
wjksd 2009-05-26
  • 打赏
  • 举报
回复
学习了[Quote=引用 2 楼 wangpingfang 的回复:]
1.使用atoi应该就可以了。
2.对于第二题,主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,因为int占四个字节,那么p指向@0,…
[/Quote]
bluesky396 2009-05-26
  • 打赏
  • 举报
回复
学习
diablox0147 2009-05-26
  • 打赏
  • 举报
回复
对于第二道题我有点疑问,为什么我把%x 换成%s就会在运行的时候出错呢???
望解答
p89787259 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangpingfang 的回复:]
1.使用atoi应该就可以了。
2.对于第二题,主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,因为int占四个字节,那么p指向@0,…
[/Quote]
很到位>....
性能侠客行 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oopsvip 的回复:]
1,如果允许用库函数,那就像楼上用atoi函数,否则就自己写一个.
2,在小端字节序下应该为37363534, 因为
sz在内存里存放的示意图(小端)----均为ASCII码表示 (pc 电脑保存的数据一般使用 little edian ,小端)
|      39 38|
|37 36 35 34|
p-> |33 32 31 30|
显然++p会指向下一个地址, 也就会输出37363534了

如果是大端 (网络传送一般使用的是big edian,大端。所有网络驱动程序一般发送字节前都要转为大端,反之,接受数据后,会转小端,然后保存)
|39 38      |
|34 35 36 37|
p-> |30 31 32 33|

输出是34353637
[/Quote]
good! 补充一下:
(pc 电脑保存的数据一般使用 little edian ,小端)
(网络传送一般使用的是big edian,大端。所有网络驱动程序一般发送字节前都要转为大端,反之,接受数据后,会转小端,然后保存)
maddingcrow 2009-05-25
  • 打赏
  • 举报
回复
学习了
字云逸 2009-05-25
  • 打赏
  • 举报
回复
还真忘了考虑各类型所占用的空间及内存存储问题了..
Haumwell 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangpingfang 的回复:]
1.使用atoi应该就可以了。
2.对于第二题,主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,因为int占四个字节,那么p指向@0,…
[/Quote]

挺透彻的
中才德创 2009-05-25
  • 打赏
  • 举报
回复
mark
pathuang68 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangpingfang 的回复:]
1.使用atoi应该就可以了。
2.对于第二题,主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,因为int占四个字节,那么p指向@0,…
[/Quote]
2楼说得很好,补充一下:
这个题目就是考,指针移动以及大尾和小尾。
例如对于0x12345678,大部分Unix机器和网络是这样0x12,0x34,0x56,0x78存储的,这种方式成为big-endian,intel处理器列如0x78 0x56 0x34 0x12这样来存储的,成为小尾little-endian。
GoonYangXiaofang 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dl591944556 的回复:]
第一题atoi(sz)就能实现
第二题 sz的0123456789
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,
int 占4个字节 char占一个字节
指针的指向发生偏移
输出为37363534
[/Quote]

学习了。
dl591944556 2009-05-25
  • 打赏
  • 举报
回复
第一题atoi(sz)就能实现
第二题 sz的0123456789
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,
int 占4个字节 char占一个字节
指针的指向发生偏移
输出为37363534
woods2001 2009-05-25
  • 打赏
  • 举报
回复
好问题···
好解答~
o0MyBelieve0o 2009-05-25
  • 打赏
  • 举报
回复
mark
加载更多回复(10)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧