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个字节。

下面我们简单的分析一下关于这几种数据类型。需要注意的是,所有的数据类型都是以二进制补码形式存储到计算机当中的。这点要尤其关注,后面会有一些c语言关于数据类型的大坑题目分析。

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 \n",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 \n",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;
}

按照正常理解,这个代码我们认为是他会打印从0到127这些数字。但是实际上结果会是个死循环。正如上面所述,当ch的值达到127时候,再次加1,成为128。但是实际上这个数字会是-128。会从-128一直加上去,所以会陷入死循环。下面附带代码运行的死循环截图。

死循环

学会了上面这些,对于无符号的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 \n",c,a+b);

	unsigned char x = 100;
	unsigned char y = 200;
	unsigned char z = x + y;
	printf("z = %d , x + y = %d \n",z,x + y);
	
	return 0;
}

代码的运行结果如下图所示。

在这里插入图片描述

认真的思考一下,为什么会是这样。我们下一篇就从这个题开始具体往下面分析。

  • 36
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值