我们都知道C语言中拥有非常丰富的整型数据类型,如字符型 char,短整型 short,整型 int......。它们每个所能表示的整数大小是不一样的,而其中也有一些复杂的转换关系,那么今天这篇博客就来梳理一下C语言中的五种整型数据类型。
首先要知道
计算机是通过晶体管的开关状态来记录数据的。它们通常8个编为一组,我们称之为字节。而晶体管有开关两种状态,一个字节有8个晶体管,因此一个字节可以拥有2的八次方个不同的状态。让每一种状态对应一个数值,这样一个字节可以表示256个不同数值。而在发明C语言的年代,计算机存储资源是非常珍贵而稀缺的。对一个字节就足够存储的情况,何必用两个字节来存储呢?
由此这就是多种整型数据类型的由来。
具体的每种类型的大小我们可以通过 sizeof 这个关键词来测量,代码如下:
#include <stdio.h>
int main()
{
printf("%zu",sizeof(char));
printf("%zu",sizeof(short));
printf("%zu",sizeof(int));
printf("%zu",sizeof(long));
printf("%zu",sizeof(long long));
return 0;
}
因为我们并不知道sizeof所返回的结果是什么,所以我们使用了 %zu 这个占位符。我将上述代码在Visual Studio 2022 中运行得到结果分别为1,2,4,4,8个字节。
其中 int 和 long 都占用4个字节让我很疑惑,经搜索为什么 long 和 int 大小相等这样是可以的,C语言标准规定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。
至此我们清楚了五种C语言规定的整型数据类型及其所占字节大小,那么它们所能表示的大小范围用人话来描述究竟是什么样的呢?
前面我们提到每个字节由8个晶体管组成,每个晶体管状态我们称之为位。那么char,short,int,long,long long分别占用了8,16,32,32,64位。
经过推演学习资料显示,如果不考虑负数,那么整型数据类型可以表达的数据范围是:假设,位数为n,则数据范围从【0】开始,到【2的n次方-1】的数值范围。而为什么有一个“-1”?那是因为我们不能在实际情况中忽略附属的存在,所以我们需要拿出一个位来作为符号位,用来表示这个数据是正数还是负数。
于是我们发现次方数比位数少一,是因为最高位被用去做符号位了。
那么一定要有这么一个少一存在吗?其实并不然。如果我们确定我们不会用到负数,那么可以使用 unsigned 关键词,这样表明这个数据类型,是不带有符号位的。既然不带有符号位了,那么原本留给符号位的那一个二进制位,就可以用来表示数值。
这就是我对整型数据类型基本概念的一些浅薄理解,而关于二进制表示法,数值的补码表示法等内容我目前还不能很好的明白,还有待继续学习!!!
标签:字节,int,数据类型,long,整型,sizeof,基本概念 From: https://www.cnblogs.com/Frolsank/p/16620644.html