笔记来源于<深入理解计算机系统>第二章.

  1. xcode里, 没写函数声明报的Error是 conflicting types for <function name>
  2. void * point 可以接受各种类型的指针, 但不能依赖它判断源数据的类型, 因为编译器认为源数据只占1个字节
  3. %X 格式化为无符号十六进制
  4. Intel为 little endian, 左边起始为低位,右边为高位; IBM为big endian,与书写习惯一致.
  5. 大端小端问题只存在于某一数据类型内部(按位操作数据的情况),int与int之间的顺序一致,由地址相加计算得出.
//
//  main.c
//  endian
//
//  Created by cbd on 16/9/1.
//  Copyright © 2016年 cbd. All rights reserved.
//

#include <stdio.h>
typedef unsigned char * unchar_point;
void show_bytes(void *point, int);

int main(int argc, const char * argv[]) {

    long long  var = 0x87654321;
    printf("var:\n十进制 0b %lld\n十六进制 0x %X\n\n",var, (unsigned)var);
    show_bytes(&var, sizeof(var));

    return 0;
}

void show_bytes(void *point, int len){
    printf("var占 %d 个字节\n", len);

    printf("little endian:Intel\n0x");
    for(int i=0; i<len; i++){
        printf(" %.2X", ((unchar_point)point)[i]);//%X 格式化为无符号十六进制
    }
    printf("\n");

    printf("big endian:IBM\n0x");
    for(int i=len-1;i>=0;i--){
        printf(" %.2X",((unchar_point)point)[i]);
    }
    printf("\n");
}

/* output:
var:
十进制 0b 2271560481
十六进制 0x 87654321

var占 8 个字节
little endian:Intel
0x 21 43 65 87 00 00 00 00
big endian:IBM
0x 00 00 00 00 87 65 43 21
*/