编程范式
- C
- 汇编
- C++
- 并发编程
- Scheme(函数式编程)
- python
1. C语言篇
数据的机内表示
short s = 67;
char ch =s;
cout<<ch<<endl;
short占两个字节,变量s的二进制表示为[0~0][01000011]
,char占一个字节,赋值过程都是简单的进行位模式的拷贝,当从大空间数据类型赋值到小空间数据类型的时候(例如上述例子),C编译器关心的是低位数据,前面的0都忽略了。所以上述例子ch的二进制值为[01000011]
,并且将会输出字母大写C。
short s = -1;
int i = s;
负整数的表示,就是对应的正整数二进制码取反加1,所以-1表示为[1~1][1~1]
,将其赋给int型的时候,还是依照简单的位拷贝,但有点不同的是,它会进行符号扩展,int的前两个字节也会变成全1。感觉这个设计是必须的,不然也没法配合二进制的简单加法了。
浮点数的表示, (−1)s×1.xxx×2exp−127 .储存浮点数的空间里用二进制存了s , .xxx 和 exp这三个值。
关于内存和指针的例子
感觉要进行泛型编程,就必须要对内存了解很透彻,在C语言中,很多东西都是直接暴露在程序员面前的,怎么把它玩好是关键。
这个例子能帮助理解数据类型、内存、指针、以及泛型的知识,也不难。
#include<stdio.h>
#include<string.h>
int StrCmp(void *x,void *y)
{
char *a = *(char **)x;//这里写成(char *)会有什么不同的影响吗?
char *b = *(char **)y;
return strcmp(a,b);
}
void * lsearch(void *key,void *base,int n,int elemsize,int (*ptr)(void *,void *))//函数指针的声明,貌似现在不必要一定写成(* func)
{
int i;
for(i=0;i<n;i++)
{
void * elemaddr=(char *)base + i*elemsize;//因为c不允许直接对void指针运算,所以先得转换为char *.
if(ptr(key,elemaddr)==0) return elemaddr;
}
return NULL;
}
int main()
{
char *a[] = {"ad","cd","qw","vz"};//a为指针数组
char *key="cd";
printf("%s",*(char *)lsearch(&key,a,4,sizeof(char *),StrCmp));
}
lsearch函数基本能对任何数据类型进行搜索操作。