1910|0

103

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【转】关于c语言知识点的一些归纳 [复制链接]

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
此帖出自编程基础论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表