[深入理解计算机系统]数据储存-大小端法与补码
2013-08-09 16:08
411 查看
#include <stdio.h> typedef unsigned char *byte_pointer; void show_byte(byte_pointer start,int len) { int i; for(i=0;i<len;i++) { printf("%.2x",start[i]); } printf("\n"); } void show_int(int x) { show_byte((byte_pointer)&x,sizeof(int)); } void show_float(float x){ show_byte((byte_pointer)&x,sizeof(float)); } void show_pointer(void *x){ show_byte((byte_pointer)&x,sizeof(void *)); } int main(){ /*show_type(byte_pointer start,int len);*/ short value = -0x12; short value2 = 0x12; byte_pointer valp = (byte_pointer)&value; byte_pointer valp2 = (byte_pointer)&value2; show_byte(valp,sizeof(short)); show_byte(valp2,sizeof(short)); /*show_int(value); show_float(value2);*/ return 0; }
显示结果:
0x12储存为1200,是因为Intel的机器大部分使用小端法储存数据(如果是大端法,该是0012)
-0x12储存为eeff,是因为负数在机器中以补码的形式储存,0x12取反再加一,再按照小端法,即为eeff。
如果将案例中的short改成int型,数据分别改为-12345和12345。如下代码所示:
int main(){
/*show_type(byte_pointer start,int len);*/
int value = -12345;
int value2 = 12345;
byte_pointer valp = (byte_pointer)&value;
byte_pointer valp2 = (byte_pointer)&value2;
show_byte(valp,sizeof(int));
show_byte(valp2,sizeof(int));
/*show_int(value);
show_float(value2);*/
return 0;
}
输出结果为:
备注:12345的二进制表示为00000000000000000011000000111001,八进制为00003039。故按照小端法,储存为3930000
相关文章推荐
- 深入理解计算机系统系列--[转] 计算机为什么用补码
- 深入理解计算机系统(3.2)------程序编码以及数据格式
- 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
- 深入理解计算机系统(3.3)------操作数指示符和数据传送指令
- 深入理解计算机系统(3.2)------程序编码以及数据格式
- 深入理解计算机系统(3.3)------操作数指示符和数据传送指令
- (深入理解计算机系统)大端模式和小端模式
- 深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
- 深入理解计算机系统-之-数值存储(一)-CPU大端和小端模式详解
- 深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解
- 深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解
- 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
- 处理器读并解释储存在存储器中的指令 读深入理解计算机系统
- 深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
- 深入理解计算机系统-之-数值存储(一)-CPU大端和小端模式详解
- 深入理解计算机系统-之-数值存储(三)-- 原码、反码、补码和移码详解
- 深入理解计算机系统之数据的表示与存储
- 深入理解计算机系统第二版习题解答CSAPP 2.12
- 深入理解计算机系统 笔记(一)
- 深入理解计算机系统第二版习题解答CSAPP 2.15