社区导航

 

搜索
查看: 515|回复: 0

[资料分享] 【转】关于c语言知识点的一些归纳

[复制链接]

144

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-6-27 16:58 | 显示全部楼层 |阅读模式
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 = %u\n", (c-1));
                test_result: c-1 = 4294967295
               
        补充:
                变量的使用,在我看来,应该是有两个过程,1.解析变量的数据类型,主要是按照这样的一个数据类型,可以去定位这个变量在内存中存放的这么一段地址空间;2.按照数据类型,来取出内存中存放数据的内容,这一点很重要的。
                原因就是看自己写的代码。
   
  1.     #include <stdio.h>

  2.         int main(int argc, char *argv[])
  3.         {        
  4.                 unsigned int b = 0x80000001;
  5.                 int a = -0x80000001;
  6.                
  7.                 printf("int_10 b = %u, int_16 b= %x\n", b, b);
  8.                 printf("int_10 a = %d, int_16 a= %x\n", a, a);
  9.                
  10.                 return 0;
  11.         }
  12.         result:
  13.         int_10 b = 2147483649, int_16 b= 80000001
  14.         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= %u\n", (b<<1), (b>>1));
                printf("a << 1 = %d, int_10 a>>1= %d, int_16 a>>1=%x\n", (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
此帖出自编程基础论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-21 18:00 , Processed in 0.085527 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表