比如 int i = 0x12345678;
对于一个很大的数字,高位变化1,影响很大;低位变化1,基本没啥影响。
可以打印出地址比较大小。
高低是一个相对量。
比如,0x01 和 0x 02 比较,前置就是低地址,后者是高地址。
字节(2个16进制位)是大小端的基本单位。
字节内部没有大小端区分。
不同变量之间也没有大小端的概念。
只有一个变量内部,在内存中表示时,才牵涉到高位放在高地址还是低地址的问题。这是CPU决定的。
#include
// **********************1
void test1(){
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
printf("x0=%d,%c\t x1=%d,%c \n", x0,x0, x1,x1); //34 17
// 低地址存的是低位(22 相当于是个位 Least significant end),小端
}
// **********************2
// 共用体检测
union myunion{
int a;
char b;
};
int isLittleU(){
union myunion s1; //共用体测试
s1.a=0x10000000;
if(s1.b==0x10){
return 0; //big
}else if(s1.b==0x00){
return 1; //little
}
return -1;
}
//指针检测
int isLittleP(){
int a;
a=0x10000001; //指针测试
char b=*((char*)(&a));
//printf(">> b=%d\n", b);
if(b==0x10){
return 0; //printf("Big\n");
}else if(b==0x01){
return 1; //printf("little\n");
}
return -1;
}
void test2(){
//代码对,分析错的博客: https://www.jianshu.com/p/47dc814c9146
// 分析合理: https://blog.csdn.net/a6333230/article/details/117117919
std::cout << "is little? union method: " << isLittleU() << std::endl;
std::cout << "is little? pointer method: " << isLittleP() << std::endl;
std::cout << std::endl;
}
// **********************3
void test3(){
// https://blog.csdn.net/wwwlyj123321/article/details/100066463
//int hexInt=0x01020306;
int hexInt=0x41426162; //ABab ->10进制 65 66 97 98 ->16进制 41 42 61 62
//获取int的地址,转为指向char的指针
char *p2=(char*) &hexInt; // 指针方式其实就是共用体的本质
printf("hexInt=%x\n", hexInt);
printf("length, char*: %d, char: %d, int: %d\n", sizeof(p2), sizeof(*p2), sizeof(int));
printf("\n\n");
for(int i=0; i<4; i++){
// 逐个打印char,不行 %c
// 逐个打印 int,可以?
printf("[%d](%p) %d %c\n",i, ( p2 +i), *( p2 +i), *( p2 +i) );
}
}
int main(int argc, char *argv[]){
void printAscii(int colNumber);
// 直接打印,int to char 失败。有人说不能强制转换,要使用指针。
test1();
test2();
test3();
//part2: 如果有额外参数,则打印ascii 码
if(argc>1){
// 打印参数列表
printf("\n>>argc:%d\n", argc);
for(int i=0; i $ g++ -std=c++11 a11.cpp
输出:

搞明白了,我确实不需要花时间搞懂这个大小端。
只有非8bits机器,或者网络字节流需要考虑
数值计算,只需要知道c++数据类型、函数、传参、引用、指针、特别是高维指针、返回、文件IO这个子集就可以了,需要改写了还要知道class等。