<深入理解计算机系统>笔记一则
笔记来源于<深入理解计算机系统>第二章.深入理解计算机系统>
- xcode里, 没写函数声明报的Error是
conflicting types for <function name>
- void * point 可以接受各种类型的指针, 但不能依赖它判断源数据的类型, 因为编译器认为源数据只占1个字节
- %X 格式化为无符号十六进制
- Intel为 little endian, 左边起始为低位,右边为高位; IBM为big endian,与书写习惯一致.
- 大端小端问题只存在于某一数据类型内部(按位操作数据的情况),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
*/