02类型转化 进程空间 数组2015/08/26

类型转化

小变量赋给大类型

char a = -1;
int b = a;
b是-1

a的符号位是1,并且a是小变量,赋给int,是4个字节的,大类型,按照低字节对齐,前面进行符号位扩充

a的二进制                                  1111 1111
b的二进制 1111 1111  1111 1111  1111 1111  1111 1111  
前面的1是符号扩充

大变量赋给小类型

int a = -256
char b = a;
b是0

按照低字节对齐,如果大变量是大于char的,多的部分进行截断,如果变量小于char,就可以

a的二进制 1111 1111  1111 1111  1111 1111 0000 0000
b的二进制                                 0000 0000  
前面的1是符号扩充

truncate 截断

隐式类型转化

整型提升
    在32位机中,所有位于低于32位的整型数据,在运算过程中先要转化为32位的整型数据  ,然后才参与运算  
浮点数没有无符号类型的,也就是说没有unsigned float类型。

转化规则
    if 有运算数是long double,那其他的数也都转化成long double
    else if 有运算数是double,那其他的数也都转化成double
    else if 有运算数是float,那其他的数也都转化成float
    else if 先把数进行整型提升, 有运算数是unsigned long int,那其他的数都转化成unsigned long int
    else if 一个数是long int,另一个数是unsigned int,只要取决于unsigned int里面的数能否被long ing包含,如果能够包含,那就都转成 long int,否则都转成unsigned long int
    else if 有一个数是long int,都转化成long int
    else if 其中一个数是unsigned int,另一个数就转成long int
    else    两个数都是int

>- 7%-3=1,因为余数的概念是5/2=2····1;所以余数应该满足2*2+1等于被除数,所以7/-3=-2·····1,(-2)*(-3)+1才等于7    

进程空间

进程空间大致分为:系统空间,command args,stack,dynamic lib,heap,data,text
其中data里面又分为uninit(未初始化)和init(初始化),init又分为rw(读写),ro(只读)
text存的是二进制可执行的文本
int main(int args, char *argv[])    //如果argv接收到的字符串在command args里面
{
    static i = 10;  //初始化全局变量init(rw)
    static a;       //未初始化 uninit 
    int b = 20; //stack
    int *c = (int *)malloc(100);    //c在static里面,malloc的空间在heap里面
    char *p = "Hello World";    //“Hello World” init(ro)
}

调用过程

void func(){}
void main()
{
    func();
}
上述程序压栈的过程: 
操作系统运行状态-->返回地址-->main()的参数-->mian()运行状态-->返回地址-->func()的参数

一维数组

a[10] = {0}不能理解为全部清零,而是把第一个设置成0,剩余的数自动清零

a[10] = {[4] = 20};把下标为4的元素设为20,其他数自动清零

[ ]:基址变址运算符

a[10] = {[4] = 20};
for(i = 0; i < 10; i++)
    printf("%d\n", i[a]);   //*(a+i) *(i+a) a是基址 i是变址 
char *p = 0;
printf("%d\n", sizeof(p));

函数参数做返回值

可以通过1级指针改变0级指针(变量)的内容
可以通过2级指针改变1级指针的指向
可以通过n级指针改变n-1级指针的指向

二维数组

多维数组都要转化为1位数组来理解

int a[2][3]; ====> int[3] a[2] ====>int[2][3]   a

printf("%p   %p\n", a+0, a+1);   // 相差12   int[3]     a[2]
 //a+1可以理解为 a[2]里面有两个int[3]类型的数,a是a[2]这个数组的首元素地址,+1就是走了一个元素类型的长度 就是12

printf("%p   %p\n", &a, &a+1);   // 相差24   int[2][3]   a
 //a的类型是int[2][3] 取地址&a 步长就是int[2][3]

你可能感兴趣的:(02类型转化 进程空间 数组2015/08/26)