数据结构---浮点数的存储&无符号数
2016-06-03 06:39
381 查看
1、c语言中的数据类型
整数类型 基本类型 浮点类型 数组类型 构造类型 结构体类型 c语言数据类型 共用体(联合) 指针类型 空类型(void) 函数执行完不需要结果时
2、学习数据类型三要素
(1)存储数据的宽度 (2)存储数据的格式 (3)作用范围(作用域)
3、整数类型
:char short int long 汇编中char 8bit 1字节 byte short 16bit 2字节 word int 32bit 4字节 dword long 32bit 4字节 历史遗留问题
在反汇编中观察,体验数据宽度的概念
char cTemp = 0xFF; 0xFF short sTemp = 0xFF; 0x00FF int nTemp = 0xFF; 0x0000 00FF char cTemp = 0x12345678; 0x78 short sTemp = 0x12345678; 0x5678 int nTemp = 0x12345678; 0x1234 5678 char == 257 试试 内存中存的1 char == 256 “初始化”: 截断常量值 warning “初始化”: 从“int”到“char”截断 C4309 整数类型分为有符号(signed)和无符号(unsigned) 类型转换、比较大小和数学运算 **总结: 1.在内存中存储的完全一样 2.在做运算的时候需要注意,你把它当什么就是什么,结果完全不同**
89: void Test() 90: { 96: char cTemp = 0xFF; 004118BE mov byte ptr [cTemp],0FFh 97: short sTemp = 0xFF; 004118C2 mov eax,0FFh 004118C7 mov word ptr [sTemp],ax 98: int nTemp = 0xFF; 004118CB mov dword ptr [nTemp],0FFh 99: printf("%d\n%d",cTemp,sTemp); 004118D2 movsx eax,word ptr [sTemp] 004118D6 mov esi,esp 004118D8 push eax 004118D9 movsx ecx,byte ptr [cTemp] 004118DD push ecx 004118DE push 41685Ch 004118E3 call dword ptr ds:[41A2BCh] 004118E9 add esp,0Ch 004118EC cmp esi,esp 004118EE call __RTC_CheckEsp (0411181h) 100: 101: char cTemp1 = 0x12345678; 004118F3 mov byte ptr [cTemp1],78h 102: short sTemp1 = 0x12345678; 004118F7 mov eax,5678h 004118FC mov word ptr [sTemp1],ax 103: int nTemp1 = 0x12345678; 00411900 mov dword ptr [nTemp1],12345678h 104: printf("%x\n%x",cTemp1,sTemp1); //0x78,0x5678 00411907 movsx eax,word ptr [sTemp1] 0041190B mov esi,esp 0041190D push eax 0041190E movsx ecx,byte ptr [cTemp1] 00411912 push ecx 00411913 push 416864h 00411918 call dword ptr ds:[41A2BCh] 0041191E add esp,0Ch 00411921 cmp esi,esp 00411923 call __RTC_CheckEsp (0411181h) 105: 106: char cTemp2 = 257; 00411928 mov byte ptr [cTemp2],1 107: char cTemp3 = 256; 0041192C mov byte ptr [cTemp3],0 108: unsigned char cTemp21 = 257; 00411930 mov byte ptr [cTemp21],1 109: printf("%d\n%d",cTemp2,cTemp3); // 1,0 00411934 movsx eax,byte ptr [cTemp3] 00411938 mov esi,esp 0041193A push eax 0041193B movsx ecx,byte ptr [cTemp2] 0041193F push ecx 00411940 push 41685Ch 00411945 call dword ptr ds:[41A2BCh] 0041194B add esp,0Ch 0041194E cmp esi,esp 00411950 call __RTC_CheckEsp (0411181h) 110: 111: char cTemp4 = 0xFF; 00411955 mov byte ptr [cTemp4],0FFh 112: unsigned char cuTemp4 = 0xFF; 00411959 mov byte ptr [cuTemp4],0FFh 113: printf("%d\n%d",cTemp4,cuTemp4); // -1,255 0041195D movzx eax,byte ptr [cuTemp4] 00411961 mov esi,esp 00411963 push eax 00411964 movsx ecx,byte ptr [cTemp4] 00411968 push ecx 00411969 push 41685Ch 0041196E call dword ptr ds:[41A2BCh] 00411974 add esp,0Ch 108: 109: } void Test1() { int i = 0xFFFFFFFF; int j = 0x1; if (i > j ) 编译结果用的jxx不同 { printf("i>j,%d\n",i); } unsigned int i1 = 0xFFFFFFFF; unsigned int j1 = 0x1; if (i1 > j1 ) { printf("i1>j1%d\n",i1); } }
4、浮点类型:float、double
120/2 0 60/2 0 30/2 0 15/2 1 7/2 1 3/2 1 1/2 1
将一个float型转化为内存存储格式的步骤:
1)先将这个实数的绝对值转化为二进制格式 2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边 3)从小数点右边第一位开始数出二十三位数组存入第22到第0位。 4)如果实数是正的,则在第31位放入0,否则放入1 5)如果n是左移得到的,说明指数是正的,第30位放入1,如果n是右移得到的或n=0则30位放0 6)如果n是左移得到的,则将n减1后化为二进制,并在左边加0补足7位,放入第29到23 如果n是右移得到的或n==0,则将n化为二进制后在左边加0补足,再各位求反,放到29到23位。 8.4 8/2=4 0 0.4*2=0.8 0 4/2=2 0 1.6 1 2/2=1 0 1.2 1 举例说明:8.25(1000.01) 1/2=0 1 0.4 0 0.8 0 0.25*2=0.5 0 1.6 1 0.5*2=1 1 1000.01 = 1.00001*2的3次方 小数点向左移动3位,指数为3 1 8 23 0 1 000 00 10 0 0 0 0 1 000000000000000000 正数存0 4104 0000 -8.25 符号 指数 尾数 1 1 000 00 10 0 0 0 0 1 000000000000000000 1:负数 1:左移 3-1 =2 10 1 000 0010 1100 0001 0000 0100 0000 0000 0000 0000 C104 0000 0.25 整数部分 0 二进制 科学 小数 10 0.01 0.01 = 1.0* 2的-2次方 往右移2位 符号 指数 尾数 0 0 111 1101 0000000000 0 右移 -3:FE FF -1 FE-2 FD -3 1111 1110 0 111 1101 -0.25 0011 1110 1000 0000 0000 0000 0000 1011 1110 1000 0000 0000 3E80 0000 BE80 0000 0.5 整数:0 小数 0.5*2=1 1 二进制 0.1 科学 1.0*2的-1次方 符号 指数 尾数 0 0 111 1110 0000000000 0 :右移 -1-1=-2 = FE 1111 1110 0 111 1110 0011 1111 0000 0000 0000 0000 0000 0000 3F00 0000 12.5 二进制:1100.1 正数:12 1100 负数.0.5 科学:1.1001*2^3 12/2 =6 0 0.5*2=1 1 整数 先转16进制,然后。。。哈哈 6/2 =3 0 指数:127+x 3/2=1 1 1/2=0 1 符号 指数 尾数 0 1 000 0010 0000000000 正数 1:左移 1001 0000 0000 0000 0000 000 3-1=2 0000 0010 1 000 0010 **127 +3 ==0x82 == 1000 0010** 0100 0001 0100 1000 0000 0000 0000 0000 4148 0000 131: float fNum = 0.25f; 3E80 0000 00411E5E movss xmm0,dword ptr ds:[00415884h] 00411E66 movss dword ptr [ebp-8],xmm0 132: float fNum1 = -0.25f; BE80 0000 00411E6B movss xmm0,dword ptr ds:[004158DCh] 00411E73 movss dword ptr [ebp-14h],xmm0 134: float fNun = 0.5f; 3F00 0000 00411E78 movss xmm0,dword ptr ds:[00415874h] 00411E80 movss dword ptr [ebp-20h],xmm0 135: 136: float fNumz = 8.25f; 4104 0000 00411E85 movss xmm0,dword ptr ds:[004158D8h] 00411E8D movss dword ptr [ebp-2Ch],xmm0 137: float fNumz1 = -8.25f; C104 0000 00411E92 movss xmm0,dword ptr ds:[004158E0h] 00411E9A movss dword ptr [ebp-38h],xmm0 整数 小数 0.11 11.75 11 = B 0.75*2=1.5 1 1011 0.5*2 =1 1 二进制:1011.11 科学:1.01111*2^3 符号 指数 尾数 0 1 000 0010 011 1100 0000 0000 0000 0 :+ 127+3 = 0x82 1000 0010 0100 0001 0011 1100 0000 0000 0000 413C 0000
4.2自己理解的浮点数
(1)整数部分:转化为16进制,然后转二进制(2)小数部分:*2完了,从上往下看
(3)用二进制科学计数表示
(4)符号:正数为0,负数为1
尾数:科学计数的小数部分,不足右边补0
指数:方法1:127+指数===转为16进制,填写。
方法2:第一位:左移为1,右移为0,不变为0
后7位:指数-1的值用二进制表示的后7位。
注意:-2 ==FD,-1=FF,用这样看,就不用计算反码了。
(5)正数和负数的二进制高位是互补的,低位不变。
(6)0.25==3E80 0000 -0.25 == BE80 0000
0.5 == 3F00 0000
11.75== 413C 0000
8.25 ==4104 0000 -8.25==C104 0000
小数表
小数计算 | A | 小数 | 值 |
---|---|---|---|
0.1*2==0.2 | 0 | 0.1 | X.00011001 |
0.2*2==0.4 | 0 | 0.2 | X.0011001 |
0.4*2==0.8 | 0 | 0.3 | X.01001 |
0.8*2==1.6 | 1 | 0.4 | X.011001 |
0.6*2==1.2 | 1 | 0.5 | X.1 |
0.2*2==0.4 | 0 | 0.6 | X.1001 |
0.4*2==0.8 | 0 | 0.7 | X.1011 |
0.8*2==1.6 | 1 | 0.8 X.11001 | |
0.9 | X.111001 |
指数 | A | |
---|---|---|
122==0x7A | 123==0x7B | 124==0x7C |
125==0x7D | 126==0x7E | 127==0x7F |
128==0x80 | 129==0x81 | 130==0x82 |
131==0x83 | 132==0x84 | 133==0x85 |
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言