摘要:
1,在c语言中用补码表示负数,如: char c = 128; printf(%d\n,c);结果是-128,c = 1000 0000 说明是负数,则所表示的负数是-(0111 1111 + 1)为-128 也可看做c的范围是-128~127,而128已经越界了,则继续表示从-128开始循环 -------------------------------
1,在c语言中用补码表示负数,如:
char c = 128;
printf("%d\n",c);结果是-128,c = 1000 0000 说明是负数,则所表示的负数是-(0111 1111 + 1)为-128
也可看做c的范围是-128~127,而128已经越界了,则继续表示从-128开始循环
------------------------------------------------
注意:0和正数的补码都是原码。。
+0:原码:0000 0000,,反码:0000 0000 ,补码:0000 0000
-0:原码:1000 0000,,反码:1111 1111 ,补码:0000 0000
1,负数的反码是其原码除符号位外其他位取反
2,负数的补码是取其反码后加1
3,字长为8时,-128没有原码和反码,因为1000 0000表示0
4,补码的出现解决了+0和-0的问题
2,char *p = malloc(0);
if(NULL == p)printf("error...\n");
elseprintf("right...\n");
p = "abc";是能分配成功的,因为p已经指向了一个确定的地址,不过存在非法访问的问题,,仅仅是引用"abc"的首地址,即把首地址赋给p
3,浮点型:单精度:有效数字长度为7位 float f1 = 33333.33333 打印出f1 = 33333.332031
双精度:有效数字长度为16位double d1 = 33333.333333打印出d1 = 33333.333333
长双精度:19位
浮点常量默认为double型
4,char型可看做是int型的一种
5,enum week{a,b,c,d,e,f,g,h };分别是0,1,2,3,4。。。
enum week myweek ;sizeof(enum week)和sizeof(myweek)值都是4
6,唯一的指针常量是NULL,数组名也是指针常量,一个字符串常量出现在表达式中,所引用的值是该字符串常量的首地址。而不是字符
如:char *str = "linux";str表示的字符型指针指向linux字符串在内存中首地址。。。
注意区别:char p[] = "linux";
char *p = "linux";两种表达形式的字符串的存储方式不一样
7,变量的存储方式:1,静态存储:static修饰的变量,以及普通全局变量含(extern修饰的)
2,动态存储:栈。。局部变量(普通局部变量),寄存器变量
static的作用:1,修饰局部变量可改变生存周期
2,修饰全局变量可改变作用于范围
3,修饰函数也是限定作用于范围
8,typedef的作用:提高程序的可移植性,简化声明const的作用:定义只读变量
-----1,const int i = 3;此时并未把i放入内存中,在被引用时,int x = i;int y = i;只是给出了变量的地址,都只会产生一份i的拷贝,而宏定义的话则会产生多分拷贝
-----2,提高效率,编译期间不分配存储空间
9,%运算和switch(c)。。case中只能用整型量..case中只能用整形或字符型的常量或常量表达式
10,自动类型转换规则:char,short->int->(unsigned (int) )/ (float) ->long ->double
11,%s以字符串格式输出时,遇到'\0'结束。
char *p = "linux";
gets(p);会出现段错误,p指向一片常量区,不能写,会出现段错误p = "hello";不会错,只是把p改变了指向
12,二维数组名指向数组首元素的首地址,a[3][4];a[i]表示一个一维数组名,指向一个一维数组首元素元素的首地址,i+1是以列数偏移
13,c语言内存分配:
堆区:malloc动态分配,free释放
栈区:自动分配
数据段:存放静态变量和全局变量
----------------------------------------
1,常量区(只读数据段):存放字符串常量和const修饰的全局变量,只可被访问不可被写入,生命周期同程序的运行过程,值不能被修改
2,静态区(普通数据段):存放普通全局变量和所有static修饰的变量
3,局部变量被const修饰,仍然存放在栈区,可以通过指针改变值,但是不能直接显示的去修改值
4,普通的整型、浮点型或字符型常量在使用时是通过立即数实现的,并没有额外分配存储区
-----------------------------------------
BSS段:未初始化的数据段
代码段:。。。。
关键字注意点:
1,void:任何其他类型的指针可以无需强转赋给void*
----void v;不合法,不能代表一个真是的变量
----void *v;合法,允许定义一个空类型的指针
2,const;
----修饰只读变量
----节省空间,避免不必要的内存分配,提高效率
----修饰一般变量,数组,指针,函数返回值和传入参数。
3,volatile
4,extern
5,enum sizeof(。。)为4
6,typedef和存储类型指示符是等价的,,
typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型=》所以typedef static int int32错误
typedef int int32;
unsigned int32 j = 10;错误,typedef 不支持此种替换
存储类型指示符:extern,static,auto,register
存储类型指示符的位置是任意的(但要求在变量名和指针*之前)
int const static t;
const int static t;
const static int t;
static const int t;几种表示方法是一致的。
上述表达式中的static可以换成typedef
typedef const int t; 都表示把t表示为const int 类型
(void (*)())0x1000 跳转到某个地址去执行指令