编程范式随课笔记(一)

编程范式

  1. C
  2. 汇编
  3. C++
  4. 并发编程
  5. Scheme(函数式编程)
  6. 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×2exp127 .储存浮点数的空间里用二进制存了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函数基本能对任何数据类型进行搜索操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值