关于机器大小端的判定
来源:互联网 发布:美国劳动生产率数据 编辑:程序博客网 时间:2024/05/17 09:04
1.首先,这个概念是怎么来的,我百度了一下,在这里简单说明一下:
出自Jonathan Swift在1726年写的讽刺小说《格列佛游记》(Gulliver's Travels)。小人国的内战就源于吃水煮鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生6次叛乱,其中一个皇帝送了命,另一个丢了王位。
——《程序员的自我修养》
另外,我在其他地方看到其实最早的时候并不是叫大小端,而是叫 “高尾端” 和 “低尾端” ,高对应大,低对应
小,相对于大小端来说还是后者更容易理解!
// 解释一下就是将 0x11223344 看作字符串 “0x11223344\0”;尾端:44;
// 高尾端就是 “11 22 33 44” 进行存储;(大端)
地址 0 1 2 3
低地址--->高地址:尾端44存在高地址;
// 低尾端就是 “ 44 33 22 11”进行存储;(小端)
地址 0 1 2 3
低地址--->高地址:尾端44存在低地址;
2. 在这里先列出我所知到的两种判断机器大小端存储的方式:
方式 1:
/* 利用指针来区分大小端 */
void Judge_duan(){int a = 1; //定义为1是为了方便 如果你喜欢你可以随意, //只要你能搞清楚 例如:0x11223344;char *p = (char *)&a;//在这里将整形a的地址转化为char*; //方便后面取一个字节内容if(*p == 1)//在这里解引用了p的一个字节的内容与1进行比较;printf("小端\n");elseprintf("大端\n");}
这是我自己画的图解 比较粗糙 希望可以帮助大家理解!
方式 2:
/* 利用联合体来检测大小端 */#include<stdio.h>#include<stdlib.h>void Judge_duan(void){union t{ int i; char c;} t1; t1.i = 1; if(t1.c == 1) printf("小端\n"); else printf("大端\n");}int main(){Judge_duan();//在这里我们封装成一个函数, //可以有参数和返回值也可以不需要system("pause");return 0;}
联合的概念在这里我简单的说明一下,不作详细介绍;
3.联合:
联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而
结构体各个成员各自拥有内存,各自使用互不干涉。
(大小端存储效率问题在此不作深究)
4. 插入一个注意事项。也是我最近犯过的错误!长时间没有编写过大小端程序的话,可能会犯!
void Judge_duan(void){int a = 1;char p = (char)a;if(a==1) printf("little");elseprintf("big");}
这个程序乍一看是不是没反应过来,其实也是个低端错误,只想着取 a 的第一个字节内容,就把 a 强制转换为
char 类型,这只是把 int 类型的 a 的十进制大小表示的 字符类型表示出来而已,并没有牵扯到大小端问题,希
望以后不会犯此类错误!
以上是我对机器大小端判定的理解,请多多指教!
- 关于机器大小端的判定
- 大小端机器的判定
- CPU大小端的判定
- 字节序问题:大小端的判定
- 大小端判定
- C++判定大小端
- CPU大小端判定
- 机器的大小端
- C语言大小端判定
- 判断机器的大小端
- 机器大小端的检测
- 机器大小端的检测
- 判断机器的大小端
- 关于二叉排序树的判定
- 关于人工智能的判定
- C语言简单程序判定大小端
- 判断机器的大小端模式
- 判断机器的大小端 && 和位数
- .NET MVC session消失问题
- 树莓派安装PyQt5
- 易语言学习第二十七课----深入内存
- 53. Maximum Subarray
- Ubuntu 12.04 更新源的方法及地址
- 关于机器大小端的判定
- Flask更新数据库出错
- 重复定义(multiple definition of)与重复包含
- Keil中build和rebuild区别
- java里面的枚举enum
- Python 迭代器
- Java中的简单工厂模式
- android 从sdcard安装apk,点击home键,出现问题
- iOS UICollectionView 使用详解