您的位置:首页 > 理论基础 > 数据结构算法

数据结构---浮点数的存储&无符号数

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.200.1X.00011001
0.2*2==0.400.2X.0011001
0.4*2==0.800.3X.01001
0.8*2==1.610.4X.011001
0.6*2==1.210.5X.1
0.2*2==0.400.6X.1001
0.4*2==0.800.7X.1011
0.8*2==1.610.8 X.11001
0.9X.111001
指数快速查询

指数A
122==0x7A123==0x7B124==0x7C
125==0x7D126==0x7E127==0x7F
128==0x80129==0x81130==0x82
131==0x83132==0x84133==0x85
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言