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