[饭后甜点] 大小端

作者: Quasars | 来源:发表于2016-07-13 14:32 被阅读52次

网络/存储字节序中有大、小端的概念,简而言之就是内存地址由高到低与数据由高位到低位的对应关系.
PS:哪个是大端,哪个是小端我也经常搞混.

简单的测试程序一枚.(Updated/linux 3.16)


  1 #include <cstdio>                                                                                                                                                                         
  2 #include <string>                                                               
  3 using namespace std;                                                            
  4 #define THIS_PLATFORM __BYTE_ORDER == __LITTLE_ENDIAN                           
  5                                                                                 
  6 int main()                                                                      
  7 {                                                                               
  8                                                                                 
  9     const char* ptr = "test";                                                   
 10     printf("const var 's addr  %p\n", ptr);                                     
 11     unsigned int y = 0x12345678;                                                
 12     string x = "1234567890";                                                    
 13 #define FORstr(i,var) for(string::iterator i=var.begin(); i != var.end(); i++)  
 14                                                                                 
 15 #define FORint(i,var) for(char* i = (char*)&(var); i < (char*)(&(var) + 1); i++)
 16     //printf("%d\n", sizeof(x.data()));                                         
 17     printf("the string obj's addr is %p\n", &x);                                
 18                                                                                 
 19     FORstr(i, x){                                                               
 20         printf("%p %c\n", i, *i);                                               
 21     }                                                                           
 22                                                                                 
 23     printf("----\n");                                                           
 24     for(int i = 0; i < x.size(); i++){                                          
 25         printf("%p %c\n", &x[i], x[i]);                                         
 26     }                                                                           
 27                                                                                 
 28                                                                                 
 29     printf("-------\n");                                                        
 30     printf("THIS PLATFORM is %s.\n", THIS_PLATFORM == true ? "little_end" : "big_end");
 31     FORint(i, y){                                                               
 32         printf("%p %x\n", i, *i);                                               
 33     }                                                                           
 34                                                                                 
 35     return 0;                                                                   
 36 }                                                                                                                                         

Output -

const var 's addr  0x400d48
the string obj's addr is 0x7fff448287e0
0x7f5028 1
0x7f5029 2
0x7f502a 3
0x7f502b 4
0x7f502c 5
0x7f502d 6
0x7f502e 7
0x7f502f 8
0x7f5030 9
0x7f5031 0
----
0x7f5028 1
0x7f5029 2
0x7f502a 3
0x7f502b 4
0x7f502c 5
0x7f502d 6
0x7f502e 7
0x7f502f 8
0x7f5030 9
0x7f5031 0
-------
THIS PLATFORM is little_end.
0x7fff448287d8 78
0x7fff448287d9 56
0x7fff448287da 34
0x7fff448287db 12

Update--------------------
来个判断大小端的代码吧?

  1 #include "common.h"                                                                                                                                                                                                                                                       
  2 #include <string.h>                                                             
  3                                                                                 
  4 bool isLittlendian()                                                            
  5 {                                                                               
  6     unsigned int x = 1;                                                         
  7     string s = "";                                                              
  8     s.resize(sizeof(x));                                                        
  9     memcpy(&s[0], &x, sizeof(x));                                               
 10     return s[0] == 1;                                                           
 11 }                                                                               
 12                                                                                 
 13 int main()                                                                      
 14 {                                                                               
 15     printf("this platform is %s\n", isLittlendian()? "littlendian" : "bigendian" );
 16     return 0;                                                                   
 17 }                                                                               

相关文章

  • [饭后甜点] 大小端

    网络/存储字节序中有大、小端的概念,简而言之就是内存地址由高到低与数据由高位到低位的对应关系.PS:哪个是大端,哪...

  • 饭后甜点

    我们人类在科学技术上每一次质的飞跃,人类都要为此付出巨大的代价,要么为了适应此,要么把此运用到军事上,要么,...

  • 饭后甜点☕

    「一」 微微细雨中图书馆门前的偷懒时刻 扑鼻而来的厚重的久违的泥土气息 和偶然拍到的狂奔在雨中的少年 「二」 那日...

  • 饭后甜点,小字伴乐

    别笑这一盅三白酒手上浇 怪你那一段拷花蓝小裙腰 纸灯再一挑散墨鬓掩唇角 桥头风和雨都静了 半卷夜航船载天地心海飘 ...

  • 小棉袄的饭后甜点

    小棉袄,像春天的小树,一路成长,晴空下思考、好奇的疑问,对世界有无数的期盼和想法,这都是这个年纪所拥有的无限可能。...

  • 大小端

    大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数...

  • 大小端

    我还是弄不清,记不住到底哪个大,哪个小,所以我暂时先不管了 bool IsLittleEndian() { i...

  • 大小端

    大小端是指大于一个字节的变量在内存中的存储顺序,在内存中,通常来说,是以字节为单位存储数据的,以c++为例,一个c...

  • IT(大小端)

    计算机内存由低地址向高地址分配 小端(低尾端):低序字节放在低地址:数:1234 -> 内存:4321 大端(高尾...

  • 大小端

    Java与平台无关默认是大端,网络上传输数据普遍采用大端C语言默认是小端数据在计算机中存储的大小端两种,以十进制数...

网友评论

    本文标题:[饭后甜点] 大小端

    本文链接:https://www.haomeiwen.com/subject/yblrjttx.html