【C语言程序设计】--C语言(一)计算机思维导论

  1. 控制台输出中文乱码问题解决:
    ref:https://blog.csdn.net/ymzhu385/article/details/121797080

基本数据类型

我们的程序离不开数据,比如我们需要保存一个数字或是字母,这时候这些东西就是作为数据进行保存,不过不同的数据他们的类型可能不同,比如1就是一个整数,0.5就是一个小数,A就是一个字符,C语言提供了多种数据类型供我们使用,我们就可以很轻松的使用这些数据了。

不同的数据类型占据的空间也会不同,这里我们需要先提一个概念,就是字、字节是什么?

我们知道,计算机底层实际上只有0和1能够表示,这时如果我们要存储一个数据,比如十进制的3,那么就需要使用2个二进制位来保存,二进制格式为11,占用两个位置,再比如我们要表示十进制的15,这时转换为二进制就是1111占用四个位置(4个bit位)来保存。一般占用8个bit位表示一个字节(B),2个字节等于1个字,所以一个字表示16个bit位,它们是计量单位。

我们常说的内存大小1G、2G等,实际上就是按照下面的进制进行计算的:

8 bit = 1 B ,1024 B = 1KB,1024 KB = 1 MB,1024 MB = 1GB,1024 GB = 1TB,1024TB = 1PB(基本上是1024一个大进位,但是有些硬盘生产厂商是按照1000来计算的,所以我们买电脑的硬盘容量可能是512G的但是实际容量可能会缩水)

在不同位数的系统下基本数据类型的大小可能会不同,因为现在主流已经是64位系统,本教程统一按照64位系统进行讲解。

原码、反码和补码

原码
上面我们说了实际上所有的数字都是使用0和1这样的二进制数来进行表示的,但是这样仅仅只能保存正数,那么负数怎么办呢?

比如现在一共有4个bit位来保存我们的数据,为了表示正负,我们可以让第一个bit位专门来保存符号,这样,我们这4个bit位能够表示的数据范围就是:

最小:1111 => - (22+21+2^0) => -7
最大:0111 => + (22+21+2^0) => +7 => 7
虽然原码表示简单,但是原码在做加减法的时候,很麻烦!以4bit位为例:

1+(-1) = 0001 + 1001 = 怎么让计算机去计算?(虽然我们知道该去怎么算,但是计算机不知道,计算机顶多知道1+1需要进位!)

我们得创造一种更好的表示方式!于是我们引入了反码:

反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
经过上面的定义,我们再来进行加减法:

1+(-1) = 0001 + 1110 = 1111 => -0 (直接相加,这样就简单多了!)

思考:1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?

0既不是正数也不是负数,那么显然这样的表示依然不够合理!

补码
根据上面的问题,我们引入了最终的解决方案,那就是补码,定义如下:

正数的补码就是其本身 (不变!)
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
其实现在就已经能够想通了,-0其实已经被消除了!我们再来看上面的运算:

1+(-1) = 0001 + 1111 = (1)0000 => +0 (现在无论你怎么算,也不会有-0了!)

所以现在,4bit位能够表示的范围是:-8~+7(C使用的就是补码!)

    char c1 = 127; //已经到达c的最大值了
    c1 = c1 + 1;  //我不管,我就要再加
    printf("%d", c1);     //这时会得到什么结果?

输出:-128

怎么127加上1还变成-128了呢?这是由于位数不够,导致运算结果值溢出:

127 + 1= 01111111 + 1
由于现在是二进制,满2进1,所以最后变成
10000000 = 补码形式的 -128
负数求补码:如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 11111111

你可能感兴趣的:(C语言,c语言,开发语言)