
整型常量
自来水厂净水过程-庶子不足与谋
2023年3月20日发(作者:percific)常量,常量的表现形式,常量的类型【常量】
常量
常量的表现形式
常量是程序中不可改变的量。
常量经常以字⾯量,或者宏定义的⽅式出现。
常量主要⽤于赋值或参与计算,并且常量也是有类型的。
字⾯量形式
我们先简单来理解常量和变量
#include
intmain()
{
intage=30;
age=age+10;
return0;
}
上⾯代码中,age是变量,30和10是字⾯常量。
宏定义形式
#include
#definePI3.1415926
intmain()
{
intradius=2;
printf("area=%f",radius*radius*PI);
return0;
}
运⾏结果为:
上⾯代码中,PI是宏定义常量,后⾯3.1415926是替换⽂本
宏定义在预处理阶段替换。
我们在linux平台进⾏演⽰:
接下来我们进⾏预处理操作:
gcc-Emain.c-omain.i
打开mian.i⽂件:
使⽤宏定义常量,在代码中所有出现宏名的地⽅都会被替换⽂本替换,修改代码中的宏名对应的替换⽂本时,只需要在宏定义的位置修改宏
明对应的替换⽂本即可。
常量的类型
我们进⾏类型说明:
#include
intmain()
{
intnumber=60;
floatsalary=1234.56;
charsex='m';
charname[]="xiaoming";
return0;
}
上⾯的60是整型常量。
上⾯的1234.56是实型常量。
上⾯的m是字符常量。
上⾯的xiaoming是字符串常量。
那么常量到底是整型中的哪⼀种类型?
实型⼜是具体的哪⼀种类型?
我们下⾯进⾏说明。
0是⼀个整型常量,但是能不能具体到某种类型的呢?
0.0是⼀个浮点型常量,但是能不能具体到某种类型的呢?
我们可以通过计算⼤⼩来进⾏解决:
#include
intmain()
{
printf("sizeof(0)=%d",sizeof(0));
printf("sizeof(0.0)=%d",sizeof(0.0));
return0;
}
运⾏结果如下:
上⾯两个都是常量0
我们通过代码验证:
上⾯的0是int类型
上⾯的0.0是double类型
默认的整型常量是int类型,默认的实型是double类型。
我们也可以通过下⾯操作修改常量类型并且打印所占字节数:
出现在数据后⾯的字母是直接对于数据类型或者说所占字节数⼤⼩进⾏限制。
#include
intmain()
{
printf("constsizeof(0.0)=%dn",sizeof(0.0));//double
printf("constsizeof(0.0f)=%dn",sizeof(0.0f));//0.0Ffloat
printf("constsizeof(0.0L)=%dn",sizeof(0.0L));//0.0llongdouble
printf("constsizeof(0)=%dn",sizeof(0));//int
printf("constsizeof(0l)=%dn",sizeof(0l));//long
printf("constsizeof(0ll)=%dn",sizeof(0ll));//longlong
return0;
}
在vs2019平台运⾏结果如下:
在Qt运⾏结果如下:
在这⾥我们要强调:
不同的平台打印出来不同的结果。
接下来我们介绍⼀种情况:
#include
intmain()
{
charch=-1;
shortsh=-1;
intin=-1;
printf("%xn",ch);
printf("%xn",sh);
printf("%xn",in);
return0;
}
运⾏结果为:
那么为什么会出现这样的结果呢?
第⼀个变量ch是char类型占1个字节,所以占8位⼆进制数,⽤⼗六进制表⽰是:FF
⼀个F表⽰4位⼆进制数字。
第⼆个变量sh是short类型占2个字节,所以占16位⼆进制数字⽤⼗六进制表⽰是:FFFF。
第三个变量in是int类型占4个字节,所以占32位⼆进制数⽤⼗六进制表⽰是:FFFFFFFF。
那么运⾏结果应该是:
ff
ffff
ffffffff
实际的结果本应该是上⾯结果,只不过这⾥进⾏了整型提升,意思就是char类型在运算的时候会转换为int,short类型在运算的时候会转换
为int,int类型在运算的时候仍然是int类型。
所以我们正常打印应该是这样打印:
#include
intmain()
{
charch=-1;
shortsh=-1;
intin=-1;
printf("%hhxn",ch);//这⾥我们给出%hhx表⽰只打印⼀个字节
printf("%hxn",sh);//这⾥我们给出%hx表⽰只打印两个字节
printf("%xn",in);//这⾥我们给出%x表⽰只打印四个字节
return0;
}
在linux平台结果为:
在Qt编译器运⾏结果为:
在vs2019编译器下⾯运⾏结果为:
上⾯打印结果不同平台会有差异。
那么char类型-1在内存中表⽰也就是11111111就是FF
short类型-1在内存中表⽰也就是11111就是FFFF
int类型-1在内存中也就是1111111111就是FFFFFFFF
注意需要深刻理解的⼀点:
我们先给出代码演⽰,然后进⾏说明。
#include
intmain()
{
charch=-1;
printf("%dn",ch);
printf("%un",ch);
printf("%un",(unsignedchar)ch);
return0;
}
运⾏结果为:
上⾯三种不同的打印结果是对于8位⼆进制数11111111的不同解释所打印的结果。
所以物理内存如何存储并不重要,重要的在于我们如何去解释这段物理存储。
11111111只是物理存储的存在。
例如上⾯打印结果:
11111111char类型就代表-1unsignedchar类型就代表255
第⼆个结果是因为在打印的过程中进⾏了整型提升到int,进⾏了隐式类型转换。
常量类型
整型常量
整型常量通常有三种表现形式
⼗进制常量
1980-23216L213u213LU
L或者l表⽰长整型
除了表⽰0以外不以0开头,避免和⼋进制混淆
U或者u表⽰⽆符号数
⼋进制常量
以0开头的连续数字序列序列中只能有0~7这8个数字。
例如:2l028711u
⼗六进制常量
以0x或者0X开头序列中只有0~9,A~F,a~f这些数字和字母。
字母a,b,c,d,e,f分别对应10,11,12,13,14,15⼤⼩写都可以。
实型常量
⼩数形式
floatsalary=1234.56;
doublenumber=6.54321;
上⾯直接出现的字⾯浮点数表⽰实型常量。
我们在这⾥说明⼀点:
printf(“.0”);
printf(“0.”);
printf(“0.0”);
上⾯三者等价
printf(“.5”);和printf(“0.5”);意义相同
printf(“5.”);和printf(“5.0”);意义相同
指数形式
指数形式及就是科学计数形式:以10为底的幂数
要求:
①:字母e或者E之前必须要有数字
②:字母e或者E后⾯的指数必须为整数
字母e或E的前后及数字之间不允许有空格
默认是double类型占8个字节
后缀为f或F表⽰float类型
后缀l或者L表⽰为longdouble类型。
例如:34.2f.5E34.5e034.2f2.5E3L
字符常量
字符常量的表现形式⽐较简单。以单引号引起来的⼀个字符。
例如:‘a’‘b’‘c’
字符串常量
字符串常量的表现形式⽐较简单。以双引号引起来的⼀串字符。
例如:”a”“abcdefg”
⼩结
最后我们强调⼀点:
默认的整型常量是int类型,默认的实型是double类型。
常量和变量在内存所保存的位置是不⼀样的,在后续博客我们进⾏详细说明。