测试机器的大小端

    1. /*
    2. * if this machine is little-endian mode, it works like this:
    3. +---------------+
    4. Low Add |ADD:0x0001|0x00| <---- cursor
    5. +---------------+
    6. High Add |ADD:0x0002|0xff| <---- cursor+1
    7. +---------------+
    8. */
    9. void endianMode() {
    10. unsigned char *cursor; //单字节的游标指针
    11. unsigned short num = 0xff00; //储存两个字节的数
    12. cursor = (unsigned char *)&num; //进行隐式类型转换
    13. if (*cursor < *(cursor + 1)) //如果高地址值更大
    14. printf("little-endian"); //则机器为小端模式
    15. else printf("big-endian");
    16. }
    1. //这段程序来自CSAPP,测试机器大小端分配方式
    2. #include <stdio.h>
    3. #include <string>
    4. typedef unsigned char* byte_pointer;
    5. void show_bytes(byte_pointer start, int len) {
    6. int i;
    7. for (i = 0; i < len; i++)
    8. printf("%.2x ", start[i]);
    9. printf("\n");
    10. }
    11. int main() {
    12. int i = 180150000;
    13. i += 1;
    14. //这个1可以换成任意小于等于0xf的数,来确认数据差异
    15. printf("%x at memory array:\n", i);
    16. show_bytes((byte_pointer)&i, sizeof(i));
    17. printf("%x\n", i);
    18. //在不同平台,大小端的排布方式不同
    19. //这个顺序可能不同
    20. const char* s = "abcdef";//算上NULL一共7个
    21. printf("%s at memory array:\n", s);
    22. show_bytes((byte_pointer)s, strlen(s)+2); //应该打印8个
    23. //但是在所有平台上ascii码的结果都几乎一致,所以ascii有更好的平台兼容性
    24. return 0;
    25. }

    结果如下

    1. abcdef1 at memory array:
    2. f1 de bc 0a
    3. abcdef1
    4. abcdef at memory array:
    5. 61 62 63 64 65 66 00 00