# include <iostream>
#include <iomanip>
using namespace std;
union endian
{
int data;
char ch;
};
void main()
{
endian ed;
ed.data = 0x12345678;
if(ed.ch == (ed.data & 0xff))
cout<<"The system is little dian."<<endl;
else
cout<<"The system is big dian."<<endl;
for(int i=0;i<sizeof(int);i++)
{
printf("%#x--------%p\n",*(((char*)&ed.data)+i),((char*)&ed.data)+i);
}
cout.setf(ios::showbase | ios::uppercase);
for(int i=0;i<sizeof(int);i++)
{
cout<<hex<<*(((char*)&ed.data)+i)<<"--------"<<hex<<((char*)&ed.data+i)<<endl;
}
for(int i=0;i<sizeof(int);i++)
{
cout<<hex<<(int)*(((char*)&ed.data)+i)<<"--------"<<hex<<(int)((char*)&ed.data+i)<<endl;
}
system("pause");
}
输出结果为:
The system is little dian.
0x78--------0012FF28
0x56--------0012FF29
0x34--------0012FF2A
0x12--------0012FF2B
x--------xV4烫烫€
V--------V4烫烫€
4--------4烫烫€
[]--------烫烫€
0X78--------0X12FF28
0X56--------0X12FF29
0X34--------0X12FF2A
0X12--------0X12FF2B
可以看到,cout<<hex<<*(((char*)&ed.data)+i);与cout<<hex<<(int)*(((char*)&ed.data)+i);输出结果不同,前者输出为乱码(未仔细分析结果)。
百度发现printf与cout的区别主要有:
cout<<是一个函数,cout<<后可以跟不同的类型是因为cout<<已存在针对各种类型数据的重载,所以会自动识别数据的类型。输出过程会首先将输出字符放入缓冲区,然后输出到屏幕。
所以我们回头看上面的问题,显然,cout<<hex<<*(((char*)&ed.data)+i);将*(((char*)&ed.data)+i)识别为char类型,所以按字符类型输出x,V,4,[]与十六进制对应为0x78,0x56,0x34,0x12(可以查阅ASCII码)。
特别注意:
printf与cout最好不要混用,因为cout流的维护比printf要高一层,cout要到回车或流刷新时才会输出。
而且ios::sync_with_stdio()决定了iostream是否和stdio同步,C++标准中规定stdio sync标志默认是true,但是有的平台下可能不会支持,或实现有差异。如果stdio sync是false的话,就可能出现输出顺序不对的情况。下列代码就是输出bbbaaa:
|
|
所以没有特殊要求,请不要混用iostream和stdio。
尤其是如果你的程序使用unicode编程的话,要在控制台输出要用wcout或者wprintf并设置本地编码。这两种输出方式设置编码的方式是不同的,而且无法兼容,一个设置对了,另外一个就不能正常工作了。