社区
C语言
帖子详情
下面应该输出什么?
objectprogram
2003-11-09 08:29:17
#include<iostream.h>
void main(){
char str[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
char ch = *((short *)str + 3);
cout<<ch<<endl;
}
输出是什么啊?
...全文
40
19
打赏
收藏
下面应该输出什么?
#include void main(){ char str[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; char ch = *((short *)str + 3); cout<<ch<<endl; } 输出是什么啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
TianGuangZao
2003-11-10
打赏
举报
回复
plainsong(短歌):
对,是 short int,程序有一点小毛病。
char ch = *((short *)str + 3);
cout<<ch<<endl;
改成:
cout << (int)ch << endl;
minghui000
2003-11-10
打赏
举报
回复
语法错误
短歌如风
2003-11-09
打赏
举报
回复
是个隐式类型转换。*((short *)str + 3)的类型是一个short。
#include<iostream>
using namespace std;
void main(){
char str[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << sizeof(*((short *)str + 3)) << endl;
char ch = *((short *)str + 3);
cout<<ch<<endl;
cin.get();
}
输出是2。
还可以这样试一下:
#include <iostream>
#include <typeinfo>
using namespace std;
template<typename T>
char const * Typename(T x)
{
return typeid(x).name();
}
void main()
{
char str[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << Typename(*((short *)str + 3)) << endl;
char ch = *((short *)str + 3);
cout<<ch<<endl;
cin.get();
}
输出是short。
TianGuangZao
2003-11-09
打赏
举报
回复
“你忘了一点,就是被解引用的不是一个char*,而是short*”
我一直不明白的就是这个问题。但我还是不敢确定是否得到的是 short。
因为
char ch = *((short *)str + 3);
编译器没给我任何提示信息,难道是隐式转换。
高尾端还是低尾端问题是我搞错了,我非科班,对底层实现知道甚少,我去找些资料补充一下,多谢指点。
短歌如风
2003-11-09
打赏
举报
回复
不过我前面正好把名词说反了:
I86是高尾端;在低尾端机器上输出是'\8'。
高尾端是指“整数的高字节存储到尾端”,低尾端则相反。
今天发烧,胡说一气,请大家见谅。
短歌如风
2003-11-09
打赏
举报
回复
TianGuangZao:
你忘了一点,就是被解引用的不是一个char*,而是short*,它的结果是short。所以并不是“取得该处的字符”,而是“取得该处的short”,因此已经与short的存储方式有关了。取出short后才又去转换为char,这时并不会管哪个字节是从内存中前面取出来的,只会取short的低字节。因此在低尾端和高尾端的机器上结果不相同的。
低尾端还是高尾端是一般是与硬件系统有关的。在I86系列的CPU中
Mov EAX, [EBX]这条指令会把[EBX]处的字节送到AL中,而[EBX + 3]处的字节送到EAX的最高位去,16位数同理。如果在这种机器上一定要实现“高尾端”的逻辑(应该是编译器决定而不是操作系统决定)也是可以的,但整数操作将会代价很大。
heibird
2003-11-09
打赏
举报
回复
对了!
TianGuangZao
2003-11-09
打赏
举报
回复
to yuantao(cfan):
(short*)str+sizeof(short)*3
相当于:
(short*)str + 6
太粗心了。
yuantao
2003-11-09
打赏
举报
回复
输出的应该是(short*)str+sizeof(short)*3地址出的字符
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
char str[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
char ch = *((short *)str + 3);
char ch1=*(str+3);
cout<<ch<<endl<<ch1<<endl;
system("PAUSE");
return 0;
}
输出的是g和d
从这个程序就可以看出来了
TianGuangZao
2003-11-09
打赏
举报
回复
((short *)str + 3) 对得到的地址解引用,取得该处的字符。
打错了,改成:
*((short *)str + 3) 对得到的地址解引用,取得该处的字符。
TianGuangZao
2003-11-09
打赏
举报
回复
谢谢短歌回复,让我学到两个新名词。不过在本例中好像不存在这种问题。
(short *)str + 3 是一个地址,相当于从数组首地址开始两个字节步长向后推移,((short *)str + 3) 对得到的地址解引用,取得该处的字符。所以并没有涉及 short int 在机器中的存储方式。
+---+---+---+---+---+---+---+---+---+---+
str| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |
+---+---+---+---+---+---+---+---+---+---+
|
|
(short *)str + 3
还有“低尾端”和“高尾端”好像是和操作系统有关的,而不是底层硬件系统,没记错的话, Linux 和 Windows 是相反的。
如果我的解释有错误,请指出。
短歌如风
2003-11-09
打赏
举报
回复
当sizeof(short)==sizeof(char)时,
*((short *)str + 3); 将取到str[6]和str[7]两个字节,并认为是一个short,这里就有一个问题:这两个字节分别是short的高字节和低字节,但不能确定哪个是高字节。
I86系统是“低尾端”存储,在存储一个short(到存储器)时,把低字节存储在低位,高字节存储在高位,而读取时也是同样的逻辑。按照这样的逻辑读出来,结果低字节就是7,高字节就是8,结果是0x807.
而“高尾端”的系统中,逻辑正好相反,认为str[7]中的是低字节,str[6]中的是高字节,结果就是0x708.
然后赋值给ch时要转换为char类型,会只保留低字节,所在在“低尾端”的机器上就是'\7',而在高尾端的机器上则是'\8'。
TianGuangZao
2003-11-09
打赏
举报
回复
plainsong(短歌):
在“高尾端”的机器上ch = '\8'。
不能理解,能否给讲一下,我觉得假定 short int 为 2 字节,应该只有一个答案 7。
flyingbirddhp
2003-11-09
打赏
举报
回复
是为7的吧~~~~~~~~~
wuyushu
2003-11-09
打赏
举报
回复
short *是强制转换,应该输出ASCII码为4的字符
wavebat533
2003-11-09
打赏
举报
回复
这不是必然的吗?
短歌如风
2003-11-09
打赏
举报
回复
上面的答案建立在sizeof(short) == sizeof(char)*2的基础上。
短歌如风
2003-11-09
打赏
举报
回复
在I86系统机上应该ch='\7',输出什么我就不知道了(这是一个控制字符)
在“高尾端”的机器上ch = '\8'。
pooryaya
2003-11-09
打赏
举报
回复
用VC6.0运行一下就知道了:)
python-标准输入
输出
本课程主要讲解python标准的输入
输出
函数,主要的内容有: 1. python的标准输入input函数 2. python的标准
输出
print函数 3. python中格式化
输出
函数 4.python中格式化
输出
占位符 5.python中常见类型转换
2022-10-20:以下go语言代码
输出
什么?A:7;B:7.0;C:0;D:编译错误。 package main import ( “fmt“ ) func main() { const
X是无类型常量,当赋值给需要类型的变量时,因为 7.0 的默认类型是 float64,因此,x.(int) 的断言是失败的,断言失败,y 的值就是 int 类型的默认值,即 0。...2022-10-20:以下go语言代码
输出
什么?
以下三条
输出
语句分别
输出
什么?
/*分别
输出
字符串的地址 str1,str2,str3,str4位于栈区,向低地址增长 str5,str6位于只读数据区,所以地址相同 */ printf("%p\t%p\n",str1,str2); printf("%p\t%p\n",str3,str4); printf("%p\t%p\n",...
2022-06-24:golang选择题,以下golang代码
输出
什么?A:1;B:3;C:4;D:编译失败。 package main import ( “fmt“ ) func mai
2022-06-24:golang选择题,以下golang代码
输出
什么?A:1;B:3;C:4;D:编译失败。 答案2022-06-24:答案选A。nums2只是nums3的一个元素。
以下代码的
输出
结果是什么?为什么?
输出
的结果是3个3,因为在主程序中遇到异步事件的时候,会将异步事件放到事件队列里面去,等到主程序执行完之后,在去执行事件队列里面的事件,此时主程序已经执行完,i变为3,由于每次
输出
都是i的值,所以是3个3 ...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章