关于C语言变量

对很多初学者来说,C语言的变量很多时候也只是使用,而不知道他们的范围,毕竟C语言中给出了多个变量的类型,并不是像现实生活中只区分为整数、小数等简单的集合,自己也在看书的时候发现很多变量的大小并不统一。所以简要整理了一下C语言中的变量类型。

一、计算机的数据存储方式

1.字节、bit位等相关概念

字节(byte)是计算机存储数据的单位,而一个字节则包含8个比特位(bit),每个比特位可以存储一个数字,而计算机中的数据都是二进制,所以比特位上存放的就是0和1两个数字,多个字节共用则可以存储很大的数字了。
在这里插入图片描述
但事实上计算机存储数字的方法并不是如此简单,这里只是简单为了理解而做的图,具体存储方式则会在下面说明。

2.常见的数据单位

生活中常用的数据单位就是byte,KB,MB,GB,TB,PB,EB,不过PB和EB的数据量太大,一般也不常见,其进制都是2的10次方一进,即1024,具体如下:
1KB=1024Byte;
1MB=1024KB;
1GB=1024MB;
1TB=1024GB;
1PB=1024TB;
1EB=1024PB;
1ZB=1024EB;
1YB=1024ZB;
1BB=1024YB;

3.计算机的原码、反码、补码

当一个数字采用二进制表示时,其二进制表示就叫做它的原码,例如数字:-85
原码:11010101
反码:10101010
补码:10101011
但我们会发现,11010101转换称为十进制数并非-85,而是213,这是因为在计算机表示中,所占bit位的第一位其实是符号位,符号位填充1表示负数,填充0则表示这个数为正数;而反码的计算则较为简单,符号位不变,其余位取反就可以了;补码的计算则是将原数+1。在这其中0是值得注意的一个数字,其原码和补码有两个,因为区分了+0和-0,所以其符号位有两种表示。
还有一个相对而言使用不是那么多的码叫做移码,移码的计算则是直接将其补码的符号位取反即可。之所以这么设计,是因为计算机所能做的运算十分简单,只可以做加法,取反,移位这三种运算。并且计算机存储数字是以补码形式存放,而不是直接以原码存放。

二、数据类型

C语言中提供了字符型、整型浮点型等基本的数据类型,在C标准中并未明确规定所有变量的大小,例如int,只是确定其占用的最少字节数应大于short类型的字节数,不同编译器对其的规定也不尽相同,但现在大多数编译器还是统一的,下面以gcc编译器的设置来介绍各个变量所占字节的大小。

变量类型 占用字节数
bool 一字节(但只占一个bit)
char 1
short int 2
int 4
long 4
float 4
double 8

可以在gcc上写一个简单的函数来测试一下
在这里插入图片描述
输出结果如下:
在这里插入图片描述
在这些变量类型中,最大值和最小值受其存储的方式所限制,例如bool型虽占一个字节来存储,但只占一个bit位来存储值(即0或1),而char型存储占用1字节,每个字节中有8个bit,所以存储的值最大为128。可以打开头文件<limits.h>查看整型的表示范围,对浮点数则可以打开<float.h>查看,这些表示范围都是在最初的16位操作系统上规定的,而对现在的编译器并不普遍适用。

#include<limits.h>

#define CHAR_BIT      8         // number of bits in a char
#define SCHAR_MIN   (-128)      // minimum signed char value
#define SCHAR_MAX     127       // maximum signed char value
#define UCHAR_MAX     0xff      // maximum unsigned char value
#define CHAR_MIN    SCHAR_MIN   // mimimum char value
#define CHAR_MAX    SCHAR_MAX   // maximum char value

#define SHRT_MIN    (-32768)        // minimum (signed) short value
#define SHRT_MAX      32767         // maximum (signed) short value
#define USHRT_MAX     0xffff        // maximum unsigned short value
#define INT_MIN     (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX       2147483647    // maximum (signed) int value
#define UINT_MAX      0xffffffff    // maximum unsigned int value
#define LONG_MIN    (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX      2147483647L   // maximum (signed) long value
#define ULONG_MAX     0xffffffffUL  // maximum unsigned long value

#include<float.h>

#define FLT_MAX          3.402823466e+38F        // max value
#define FLT_MIN          1.175494351e-38F        // min normalized positive value

#define DBL_MAX          1.7976931348623158e+308 // max value
#define DBL_MIN          2.2250738585072014e-308 // min positive value

不过由于几种数据类型的占用字节数相同,所以只是列出了基本的数据类型,详细的可以打开以上两个头文件查看。

变量涉及的问题很多,例如在char型中存储超过128的数字会出现什么情况、其在编译器中的变化过程等等,后续会在博客中继续总结。

新手出道,请大佬多指教。

猜你喜欢

转载自blog.csdn.net/qq_45132647/article/details/105245246
今日推荐