本篇文章主要是讲在我们C语言中,可能我们经常在数字的前面或者后面看到一些符号,比如说我们比较熟悉的0xFF就表示16进制的数字等等。可能我们在阅读代码中遇到一些我们不太理解的符号我们也不会去理会它的具体含义,比如 #define REGISTER 12345u,那这个u代表什么意思?到底会对程序产生怎样的影响?我们在什么情况下需要在这些数字的前面或者后面加入这些字符?
一:字符在“前”
“字符在前”的数值常量的情况一般都是进制类常量,那么大部分会想到二进制、十进制、八进制和16进制,然而在我们平时编程中使用比较多的就属十进制和16进制,那么二进制和八进制的数值常量如何表示呢?
(1)对于八进制,十进制、16进制以及浮点的数值常量C语言是有明确规定的:
16进制:由0x或者0X开头,由0~9,A~F或a~f组成。
八进制:由数字0开头,0~7组成。
十进制:开头可以使用+-号,0~9组成。
浮点型:开头可以使用+-号,数字0~9及点号组成。
(2)然而标准的C语言对二进制并没有并没有规定具体的格式,不过在部分编译器中厂家会自行扩展一些二进制格式,比如0b0100表示10进制4。至于为什么没有规定二进制主要的原因是其可读性差,并且难以维护,且均可以用16进制代替!
二:字符在“中”
字符在中间的数值常量可能大家都用得比较少,做算法的各位同志们用得比较多,那就是我们的科学记数法。科学计数法:例如1e-10,表示的是1.0*10的-10次方。e的前面是整数部分,e的后面是10的次数部分。
注意: 1、计数法中的e可大写可小写;
2、e前后必须有数字,可正可负可为0,不可省略;
3、e后面必须为整数,不能存在变量(可正可负,正号可以省略)。
三:字符在“后”
这篇文章的重点也就是主要讲数值常量字符在后的形式!我们经常看到如132424245ul,3.141592f的数值形式,或者是单片机的地址宏定义数值后面加ul,如0xA80000ul。
比如说上面16进制后面为什么要加上ul?可能有很多小伙伴们都看到过这样的数值常量形式,大多都没有深究也就当个普通常量来使用了,既然有人这样写了必定有他的意义,下面我就为大家总结了一下供大家参考:
1、u或者l(l,u,f大小写均可)在整形数值后面分别表示unsigned int 和long int;同样ul(大写的UL亦可)组合起来表示unsigned long,而不是默认int型。
2、同样f或者F作为后缀,表示的是float型。而不是默认double。
3、如果l放在小数后面表示该数值为double型。
这样做的意义是什么?
1、u显式的声明为无符号型,防止编译器对齐进行处理,比如移位的时候添加0还是添加1的问题。
2、l表示长整形,也是为了防止编译器将数据截断或者强制转化而溢出,所以进行声明加l。
3、使用f表示float仅占用4个字节,这样可以减少存储设备的空间占用。(这里提到了节省,所以大家可以做下笔记,以后项目中需要省成本就得这样!哈哈哈哈哈哈)
另附:
数据类型 | 16位系统(byte) | 32位系统(byte) | 64位系统(byte) | 备注 |
int unsigned int | 2 | 4 | 4 | |
char | 1 | 1 | 1 | |
shor、unsigned short | 2 | 2 | 2 | |
long unsigned long | 4 | 4 | 8 | |
float | 4 | 4 | 4 | |
double | 8 | 8 | 8 | |
long long | 8 | 8 | 8 | |
long double | 10/12 | 10/16 | 有效位10字节,32位为了对齐实际分配12字节;64位分配16字节 | |
指针 | 2 | 4 | 8 |