编程william hill官网
直播中

jf_ed1027847

8年用户 2181经验值
擅长:模拟技术
私信 关注
[讨论]

替发:c语言知识点归纳 by:lemon

这篇文章是代替柠檬版主发布的,因为工作太忙没有时间编辑帖子,但是又想和大家分享经验和知识,所以真的非常感谢柠檬守护版主的分享。大家有什么问题也可以回帖询问,柠檬版主有时间会来与大家互动的。


正文:
1.数据类型与变量的本质
        与传统的讲法不同的是,结合实实在在内存这样的概念,来对这两个名称的说明。
       
        其实数据类型他到底是干什么用的呢? 老师讲的模子是比较形象的说法,lemon:在针对早期程序设计语言中[特别是汇编语言],不方便对数据大小的严格区分[数据是连续的存放在内存的空间中的],C语言的创造者,借由数据类型这样的定义,来描述内存中某一段连续的空间所代表一个意义。 比如说,在内存中一段连续的4个字节,认为他叫int,是一个int类型的数据,特征就是占用了四个连续的空间。
       
        变量,也是表示内存中某一段连续空间,只是不一样的地方是,变量是有内容的,内容就是存放在这一段连续空间的数据[如果不定义的话,那就是随机值,由最后一次该连续的地址空间操作后的值],所以变量与数据类型的关系是数据类型是变量的一个属性[特征],变量拥有数据类型这样的属性。
       
        总结来说,变量有两个属性,第一个是数据类型[数据类型,表示在内存中的一段连续的地址空间,不同的类型,代表的空间大小不同],第二个是内存空间中存储的内容[我称呼他为value,这个value可以是我们常见的整数,字符,字符串,浮点数,也可以是表示地址空间的门牌号[地址值]]

        从来没有这样做过,sizeof(char),对模子进行丈量,测一下它在内存中占据的空间大小。
       
        数据类型是研究人员定义的一个名词,描述了内存中,某一段空间的大小。 int表示,内存中4个字节的大小。
       
2. 有符号和无符号
        这个部分,最重要的内容是知道几个定义:
        1. 有符号数和无符号数是针对整形这一种数据类型专有的,所以只能看到在char,int,long int前有这样的定义。 unsigned int, signed int, unsigned char, signed char。
        2. 我们知道,忽省的情况,比如说Int a的时候,a是signed还是unsigned呢? 答案是signed.
        3. 符号位是位于最高位,如果是32bit的系统,对于int型的变量,其符号位是在bit31,对于char型的变量,其最高位是在bit7. 表示一个正数,最高位为0,表示一个负数,最高位为0.
        4. 无符号数与有符号数一起参与运算的时候,有符号数会变成无符号数之后,在来进行运算。
        5. 无符号数有一个很有趣的现象,MAX_NUM+1=MIN_NUM;MIN_NUM-1=MAX_NUM;
                unsigned int c = 0;
                printf("c-1 = %un", (c-1));
                test_result: c-1 = 4294967295
               
        补充:
                变量的使用,在我看来,应该是有两个过程,1.解析变量的数据类型,主要是按照这样的一个数据类型,可以去定位这个变量在内存中存放的这么一段地址空间;2.按照数据类型,来取出内存中存放数据的内容,这一点很重要的。
                原因就是看自己写的代码。
        #include

        int main(int argc, char *argv[])
        {       
                unsigned int b = 0x80000001;
                int a = -0x80000001;
               
                printf("int_10 b = %u, int_16 b= %xn", b, b);
                printf("int_10 a = %d, int_16 a= %xn", a, a);
               
                return 0;
        }
        result:
        int_10 b = 2147483649, int_16 b= 80000001
        int_10 a = -2147483647, int_16 a= 80000001

        1)负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的右边补1。如果一直右移的话,最后就就变成0xFFFFFFFF 即-1
        如: -4>>1 为-2 ;-4>>2为-1
        2)负数的左移:跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。-2<<2 为-4 ; -2<<31为0
                unsigned int b = 0x80000000;
                int a = 0x80000000;
                printf("b << 1 = %u, b>>1= %un", (b<<1), (b>>1));
                printf("a << 1 = %d, int_10 a>>1= %d, int_16 a>>1=%xn", (a<<1), (a>>1),(a>>1));               
               
                result:
                b << 1 = 0, b>>1= 1073741824
                a << 1 = 0, int_10 a>>1= -1073741824, int_16 a>>1=c0000000



回帖(5)

张金权

2017-3-1 15:58:32
支持下
举报

景阳华泰

2017-4-18 14:16:49
板凳!!!!!
举报

张君

2017-4-20 15:31:10
可以                                          
举报

王鸿

2017-5-30 14:38:59
十分完整的c语言知识点归纳,学习了,感谢楼主分享
举报

654524

2017-8-2 09:30:00
C语言在我看来,是除了汇编语言之外最有趣的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分