《编程范式》学习笔记
2017-06-12 22:33
218 查看
(一)编程范式
(1)八位能表示最大的数是多少?
为255,最多能表示256个数(包括0),2^x=2^0+2^1+2^2+2^3+…………+2^(x-1)+1
(2)二进制计算:负整数与正整数相加的结果0时,是如何进行二进制运算的?
以short类型(2字节)为例,00000000 00001111 与10000000 00001111相加,对后者取反加1得到11111111 11110001,相加便得到00000000 00000000。-1的二进制表示是个例外,以short为例,为11111111 11111111,因为1的表示为0000 0001,相加正好为0。
(3)不同数据类型之间的赋值
字节数小的赋值给字节数大的,例char赋值给short,00001111转化为short类型,结果为00000000 00001111。字节数大的赋值给字节数小的,例01010000 00001111转化为char类型,则舍弃多余的字节得到00001111,在这里有个误区,例A类型最大能表示的值为100,现在想要将值为123的B类型转化为A类型,不能想当然的认为转换后为100。另外由于-1的char表示为1111 1111,若要将其转化为short类型,需要进行符号扩展,从而变成11111111 11111111。
(4)浮点数的二进制是如何表示的,以float为例?
数学公式为 (符号位)1.xxxx*2^(exp-127) exp为八位无符号整型,范围为-255~255
[符号位][八位无符号整型,即exp][23位表示小数(2^-x),即.xxxx]
(5)强制类型转换(简单讲讲)
float j=4.0;
int i=(int )&j;
此时j的各位值都不会变,而i会照搬其各位的值,当然,获得的值不是4。
float j=4.0;
short i=(short )&j;
此时short类型只有2个字节,因此只将float的前两个字节的数照搬过来。
(二)C语言
(1)struct
得出的结果为2,其中原理如图:
(exm *)&(sa.b)->b=3;
print((&sa)[1].a) 输出为3,其中原因为把&sa当成了数组首地址,基础单位为exm。
(2)无论是string、int、float、short,他们都是线性寻址,举个Int的例子。
对于其他类型来说,所做的操作也是一样的,就是根据一个地址逐单位寻址。
(3)我们可以编写一个具有泛化能力的swap函数,它将是一个可以输入任何类型的函数。
其中memcpy函数前两个参数为指针,第三个参数为复制字节数,它会根据字节数按顺序对指针进行解引用并复制内容。
这个函数可以接受任何类型的输入,它不关心输入的为什么类型,只关心首地址与复制长度。s事实上任何类型的输入都不会引发编译器的报错。一下为几个特例:
(a)
(b)
在这段程序中,swap的输入实际上为char**类型,以a举例,1234四个字符的值在堆中,他们相应的指针在栈中保存,而输入为&a,这意味着输入为指针的地址,所以swap所交换的实际上是指针的值,由于size为4,所以只交换数组首地址的值,首地址交换,输出的值自然也就交换了。
(c)
在这段程序中,swap的输入为char*类型,即将数组首地址传入,size为1,因此所改变的实际上为堆中数组的值。
(4) 我们将再写一个具有泛化能力的搜索函数,就是在一个数组中搜索指定的值。
void * lsearch(void *key,void *base,int n,int elemSize) //key为想要搜索的值,base为数组首地址,n为数组元素个数,elemSize为数组中元素大小。
(1)八位能表示最大的数是多少?
为255,最多能表示256个数(包括0),2^x=2^0+2^1+2^2+2^3+…………+2^(x-1)+1
(2)二进制计算:负整数与正整数相加的结果0时,是如何进行二进制运算的?
以short类型(2字节)为例,00000000 00001111 与10000000 00001111相加,对后者取反加1得到11111111 11110001,相加便得到00000000 00000000。-1的二进制表示是个例外,以short为例,为11111111 11111111,因为1的表示为0000 0001,相加正好为0。
(3)不同数据类型之间的赋值
字节数小的赋值给字节数大的,例char赋值给short,00001111转化为short类型,结果为00000000 00001111。字节数大的赋值给字节数小的,例01010000 00001111转化为char类型,则舍弃多余的字节得到00001111,在这里有个误区,例A类型最大能表示的值为100,现在想要将值为123的B类型转化为A类型,不能想当然的认为转换后为100。另外由于-1的char表示为1111 1111,若要将其转化为short类型,需要进行符号扩展,从而变成11111111 11111111。
(4)浮点数的二进制是如何表示的,以float为例?
数学公式为 (符号位)1.xxxx*2^(exp-127) exp为八位无符号整型,范围为-255~255
[符号位][八位无符号整型,即exp][23位表示小数(2^-x),即.xxxx]
(5)强制类型转换(简单讲讲)
float j=4.0;
int i=(int )&j;
此时j的各位值都不会变,而i会照搬其各位的值,当然,获得的值不是4。
float j=4.0;
short i=(short )&j;
此时short类型只有2个字节,因此只将float的前两个字节的数照搬过来。
(二)C语言
(1)struct
struct exm { int a; int b; } exm sa; sa.a=1; sa.b=2; print (exm *)&(sa.b)->a
得出的结果为2,其中原理如图:
(exm *)&(sa.b)->b=3;
print((&sa)[1].a) 输出为3,其中原因为把&sa当成了数组首地址,基础单位为exm。
(2)无论是string、int、float、short,他们都是线性寻址,举个Int的例子。
int x=1; int y=2; swap(&x,&y); int swap(int *xp,int *yp) //xp,yp为x、y的地址 { int temp=*xp; *xp=*yp; *yp=temp; //这里的*x就相当于int类型的x }
对于其他类型来说,所做的操作也是一样的,就是根据一个地址逐单位寻址。
(3)我们可以编写一个具有泛化能力的swap函数,它将是一个可以输入任何类型的函数。
void swap(void *vp1,void *vp2,int size) { char buffer[size]; memcpy(buffer, vp1,size); memcpy(vp1, vp2,size); memcpy(vp2, buffer,size); }
其中memcpy函数前两个参数为指针,第三个参数为复制字节数,它会根据字节数按顺序对指针进行解引用并复制内容。
这个函数可以接受任何类型的输入,它不关心输入的为什么类型,只关心首地址与复制长度。s事实上任何类型的输入都不会引发编译器的报错。一下为几个特例:
(a)
short a=2; int b=3; swap(&a,&b,sizeof(short)) //只会复制前两个字节
(b)
char *a=strdup("1234"); //strdup() 可在堆中为一个char数组分配内存,并返回首地址。 char *b=strdup("4567"); swap(&a,&b,sizeof(char *)); //char *为指针类型,为四个字节. cout<< a<<endl; //输出为4567 cout<< b<<endl; //输出为1234
在这段程序中,swap的输入实际上为char**类型,以a举例,1234四个字符的值在堆中,他们相应的指针在栈中保存,而输入为&a,这意味着输入为指针的地址,所以swap所交换的实际上是指针的值,由于size为4,所以只交换数组首地址的值,首地址交换,输出的值自然也就交换了。
(c)
char *a=strdup("1234"); //strdup() 可在堆中为一个char数组分配内存,并返回首地址。 char *b=strdup("4567"); swap(a,b,sizeof(char); //char *为指针类型,为四个字节. cout<< a<<endl; //输出为4234 cout<< b<<endl; //输出为1567
在这段程序中,swap的输入为char*类型,即将数组首地址传入,size为1,因此所改变的实际上为堆中数组的值。
(4) 我们将再写一个具有泛化能力的搜索函数,就是在一个数组中搜索指定的值。
void * lsearch(void *key,void *base,int n,int elemSize) //key为想要搜索的值,base为数组首地址,n为数组元素个数,elemSize为数组中元素大小。
{ for(int i=0;i<n;i++) { void * elemAddr=(char *)base+i*elemSize; //在这里是数组首地址的平移 if(memcmp(key,elemAddr,elemSize)==0)//memcmp是一个比较函数,他会根据size依次对字节的值进行比较。 { return elemAddr; //返回结果指针 } } return 0; }
相关文章推荐
- Django学习笔记(二)App创建之Model
- 《C++Primer》学习笔记(11-12章)
- Google《Android性能优化》学习笔记
- 《第一行代码-Android》学习笔记(二十一)WebView控件总结【修改】
- 学习笔记(四)图的遍历
- I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植
- 学习笔记-ListView中控件的刷新-setTag的两种用法
- Django学习笔记(2):Django视图和URL
- ios事件处理学习笔记
- 《大话设计模式》学习笔记18:桥接模式
- 《Java编程思想》学习笔记2——对象初始化和面向对象特性
- 《Java编程思想》学习笔记15——对象序列化
- 《汇编语言》学习笔记 第二章 寄存器
- 《敏捷测试的最佳实践》学习笔记(一)
- python学习笔记
- 学习笔记
- scrapy学习笔记——安装
- ubuntu中安装samba 分类: linux 学习笔记 ubuntu 2015-07-07 16:14 46人阅读 评论(0) 收藏
- python学习笔记——Tkinter GUI编程——简介
- 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件