C语言中的基本数据类型(一)
数据类型基础分析
c语言中数据类型有很多种类,基本的数据类型有如下几种:char,short, int , long int, long long, float, double, long double, bool 等等。
以32位机器为例,首先我们应该知道,计算机的每个存储单元都是一个字节八个比特位置。
其中char类型占用1字节。short类型占用2字节。int占用4字节。long int 4字节。long long 8字节,float 4字节。double 8字节。long double 8字节。bool 占1个字节。
char数据类型
char类型在c语言中占1个字节,也就是8个比特位。
#include<stdio.h> int main() { char ch = "a"; return 0; }
比如在上面的代码当中,定义了一个字符类型的数据。变量名为ch,值为"a",但是实际在内存当中存储的是"a"对应的Ascll值,也就是对应的值为97。也就是说,如下代码定义同样有效。
#include<stdio.h> int main(){ char ch = 97; printf("%c ",ch); return 0; }
这段代码打印的结果任然会是字母a。也就是可以证明计算机真实存储的并不是a本身,而是97这个值,不过对应的是char类型,所以用%c格式输出时候,会打印出a。
而我们都知道,计算机存储数据是以二进制类型存储的,所以,这个值实际在计算机中的存在是0101 0110这样的形式。一定要注意,这里是以补码形式存在的,只不过所有正数的原码和补码是相同的。
所以注意以下代码。
#include<stdio.h> int main(){ char a = 5; char b = -5; return 0; }
这里的a是5,所以他对应的二进制补码为0000 0101,但是b的值为-5,最高位为符号为,原码取反加1得到补码。所以b在计算机存储中实际为1111 1011。
接着我们就要思考一个相当重要的问题。既然char类型实际存放的是数值,并且是一个字节,所以在有符号的char类型当中,它的表示范围应该是什么呢?答案是-128~127之间。有符号类型后面说明。
这里我们用如下图示来表示这些数值在计算机中的存储方式。 在上图中,0000 0000 一直到0111 1111就是0到127,对应的1111 1111 一直到1000 0000 就是-1到-128。这里一定要注意。1000 0000 这个数字被称作魔鬼数字。也有人把他称作-0。实际上最高位置的1既代表数值位又代表符号位。因为char只能表示8个比特位,所以进位的第九位会被舍弃。
我们来看下面一段代码和运行结果。
#include<stdio.h> int main(){ char ch = 128; printf("ch = %d ",ch); return 0; }
很多人会有这样的疑问,明明定义的是128,为什么我们打印出来的会是-128。其实这个结果恰恰可以说明我们上面所说的结论,128在二进制当中的补码形式是1000 0000 ,这个数字恰恰好是我们所说的魔鬼数字。也就是说当编译器看到这个数字时候最高位是符号位1,也就是个负数,1又是数值为。所以这个数字实际打印的恰好会是-128。
接下来我们继续看一段有趣的代码。
#include<stdio.h> int main(){ for(char ch = 0; ch < 128 ;++ch ){ printf("ch = %d ",ch); } return 0; }
学会了上面这些,对于无符号的char类型我们也应该类比学习。也就是说无符号char类型表示范围是0-255。同样是补码形式存在。下面我们看一个有趣的练习题目。(阿里巴巴面试题)
#include<stdio.h> int main(){ char a = 100; char b = 200; char c = a + b; printf("c = %d ,a + b = %d ",c,a+b); unsigned char x = 100; unsigned char y = 200; unsigned char z = x + y; printf("z = %d , x + y = %d ",z,x + y); return 0; }
代码的运行结果如下图所示。