您现在的位置是:首页 > 正文

C语言-----格式字符、整型、字符型、浮点型

2024-02-01 05:40:55阅读 2

1、格式字符​

格式字符是由“%”和字符组成,其作用是将输出的数据转化为指定的格式输出。

格式字符表如下:

%d/%i 有符号的十进制整数,i 是老式写法
%u 无符号十进制整数
%c 字符
%s 字符串
%f 单精度浮点数
%lf 双精度浮点数(lf 在 C99 开始加入标准,意思和 f 相同)
%p 以 16 进制形式输出指针
%o 无符号 8 进制整数
%n 到此字符之前为止,一共输出的字符个数,不输出文本
%% 不进行转换,输出字符“ % ”(百分号)本身
%x 无符号 16 进制整数
%e(%E) 浮点数指数输出[ e-(E-)]记数法]

 2、整型

整型数据,英文单词是Integer,比如-2、-1、0、1、2、1234、等等都是整形数据。整型数据是不允许出现小数点和其他特殊符号的数据。

整型数据共分为7类,如下图:

其中短整型、整型、和长整型为有符号数据类型。

2.1 取值范围

在我们使用不同的数据类型时,需要注意的是不要让数据超出范围,否则就会造成常说的数据溢出。

类型 说明 字节 范围
整型 int 4 -2147483648~2147483647
短整型 short (int) 2 -32768~32767
长整型 long(int) 4 -2147483648-2147483647
无符号整型 unsigned(int) 4 0-4294967295
无符号短整型 unsigned short (int) 2 0-65535
无符号长整型 unsigned long (int) 4 0-4294967295
字符型 char 1 0-255

 2.2 有符号和无符号

int类型在内存中占用了4个字节,也就是 32位。因为 int 类型是有符号的,所以这32 位并不是全部用来存储数据的,使用其中的 1 位来存储符号,使用其他的 31 位来存储数值。为了简单起见,下面用一个字节 8 位来说明。

对于有符号整数,以最高位(左边第 1位)作为符号位,最高位是 0,表示的数据是正数,最高位是 1,表示的数据是负数。

整型 10 二进制形式:

0 0 0 0 1 0 1 0

整型-10二进制形式:

1 0 0 0 1 0 1 0

对于无符号整数,因为表述的都是非负数,因此一个字节中的8位全部用来存储数据,不再设置符号位。

整型 10 二进制形式:

0 0 0 0 1 0 1 0

 整数138二进制形式:

1 0 0 0 1 0 1 0

2.3 类型间转换

不同类型的整型数据所占的字节数不同,在相互转换时就需要格外留心,不要将过大的数据放在过小的数据类型中。在把所占字节较大的数据赋值给占字节较小的数据时,应防止出现以下的情况。

#include<stdio.h>

int main()
{
    int a=2147483648;
    printf("%d",a);
    return 0;
}

这样赋值后,输出变量a的值并非预期的2147483648,而是-2147483648,原因是2147483648超出了int 类型能够装载的最大值,数据产生了溢出。但是换一种输出格式控制符,如下:

#include<stdio.h>

int main()
{
    int a=2147483648;
    printf("%u",a);
    return 0;
}

输出的结果就是变量 a 的值,原因是%u 是按照无符号整型输出的数据,而无符号整型的数据范围上限大于2147483648 这个值。

例如:

#include<stdio.h>

int main()
{
    unsigned short a = 256;
    char b = a;
    printf("%d",b);
    return 0;
}

这样赋值后,输出变量b的值并非预期的 256,而是0,原因是256 超出了 char 类型能够装载的最大值,b只截取了a的低8位的数据,如下:

当把所占字节较小的数据赋值给占字节较大的数据时,可能出现以下两种情况。第1种情况,当字节较大数是无符号数时,转换时新扩充的位被填充成0。

例如:

#include<stdio.h>

int main()
{
    char b = 10;
    unsigned short a = b;
    printf("%u",a);
    return 0;
}

这样赋值后,变量a中输出的值是 10,原因如下:

第 2种情况,当字节较大数是有符号数时,转换时新扩充的位被填充成符号位。

例如:

#include<stdio.h>

int main()
{
    char b = 255;
    short a = b;
    printf("%d",a);
    return 0;
}

这样赋值后,变量a输出的值是-1,变量a扩充的高8 位,根据变量b的最高位1 都被填充成了1,所以数值由正数变成了负数,因为变量a 的最高位符号位是1。至于为什么16个1表示的是-1,涉及到二进制数的原码和补码问题,这里我们先不深究。转换图示如下:

 3、字符型

字符型是整型数据中的一种,它存储的是单个的字符,存储方式是按照 ASCII码(American
Standard Code for Information Interchange,美国信息交换标准码)的编码方式,每个字符占一个字节、8位(bit)(关于ASCII码,可查阅C语言书籍ASCll表的相关内容)。

字符使用单引号“ ' ”引起来,与变量和其他数据类型相区别,比如'A','5','m','&'等。

又比如有这样4个字符:'H','e','l','o',它们在内存中存储的形式如下所示。

01001000 01100101 01101100 01101111
H e l o
#include<stdio.h>

int main()
{
    char c = 'A';
    printf("%c,%u",c,c);
    return 0;
}

输出结果是:A,65。

此处的65是字符'A'的ASCII码。

因为字符是以ASCII码形式存储的,所以字符 A 和整数65是可以相互转换的。

在字符的家族中,控制符是无法通过正常的字符形式表示的,比如常用的回车、换行、退格等,而需要使用特殊的字符形式来表示,这种特殊字符称为转义符。

转义符 说明 ASCll
\n 换行,移动到下一行首 00001010
\t 水平制表键,移动到下一个制表符位置 00001001
\b 退格,向前退一格 00001000
\r 回车,移动到当前行行首 00001101
\a 报警 00000111
\? 输出问号 00111111
\’ 输出单引号 00100111
\” 输出双引号 00100010
\ooo 八进制方式输出字符,o表示八进制数
\xhhh 十六进制方式输出字符,h表示十六进制数
\0 空字符 000000

4、浮点型

C语言中除了整型外的另外一种数据类型就是浮点型,浮点型可以表示有小数部分的数据。浮点型包含 3 种数据类型,分别是单精度的 floa t类型、双精度的 double 类型和长双精度 long double 类型。

浮点型数据的所占字节、位数、有效数字和取值范围如表所示:

类型 字节 位数 有效数字 取值范围
float 4 32 6~7 -1.4e-45~3.4e38
double 8 64 15~16 -4.9e-324~1.8e308
long double 8 128 18~19 ————

               浮点型数据精度高占据的存储空间大。

浮点型数据在计算机内存中的存储方式与整型数据不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。根据浮点型的表现形式不同,我们还可以把浮点型分为小数形式和指数形式两种。

指数形式如下所示('e'或者'E'都可以):


 2.0e3                      表示2000.0
1.23e-2                    表示0.0123
123e2                      表示12.3
1.e-3                        表示0.001


 对于指数形式,有以下两点要求:
(1)字母e前面必须要有数字;
(2) 字母 e的后面必须是整数。

注 意:浮点数是有有效位数要求的,所以要比较两个浮点数是否相等,比较这两个浮点数的差值是不是在给定的范围内即可。

网站文章

  • 文件包含&条件竞争

    文件包含&条件竞争

    session.upload_progress与open_basedir、allow_url_fopen、allow_url_include等PHP配置一样,session.upload_progre...

    2024-02-01 05:40:48
  • Unity:圆底烧瓶中液体液面升降变化的效果

    Unity:圆底烧瓶中液体液面升降变化的效果

    在Unity中:如何实现圆底烧瓶中液体液面升降变化的效果

    2024-02-01 05:40:21
  • Gstreamer利用category调试

    之前总结过category的定义和使用,基于这个基础,发现利用gstreamer的categories和log系统,调试起来效率会提升很多。这两个例子都是Gstreamer中基础的部分,其他的elem...

    2024-02-01 05:40:14
  • 基本算法之枚举.205.余数相同问题

    求余

    2024-02-01 05:40:07
  • selenium自动化截图的方式

    自动化截图的三种方式

    2024-02-01 05:39:37
  • idea基本建立工程与注意事项

    1.src–&gt;new–&gt;Package 2.File–&gt;New–&gt;Module 3.File–&gt;New–&gt;Project 4.File–&gt;Project Structure 5.具体包–&gt;New --&gt;Java Class 6.remove–&gt;delete后检查.idea下的modules.xml

    2024-02-01 05:39:31
  • BUUCTF:[watevrCTF-2019]Pickle Store

    BUUCTF:[watevrCTF-2019]Pickle Store

    题目地址:https://buuoj.cn/challenges#[watevrCTF-2019]Pickle%20Store Pickle反序列化 使用pickle.loads()和base64对这...

    2024-02-01 05:39:25
  • 阿里云网盘和百度网盘功能体验上谁更胜一筹呢?

    阿里云网盘和百度网盘功能体验上谁更胜一筹呢?

    阿里云网盘和百度网盘功能体验上谁更胜一筹呢?由阿里巴巴推出的阿里云网盘即将上线,相信这对于百度网盘来说将是一个强劲的对手,会流失许多的用户。那么阿里云网盘和百度网盘哪个好?这两个网盘在功能和体验上谁更...

    2024-02-01 05:39:18
  • Element级联选择器自定义value label

    Element级联选择器自定义value label

    实际项目中后端返回的数据属性可能不是以`label/value`等命名的,这时候数据就渲染不上去。我们需要利用`props`指定选项的值为选项对象的某个属性值。

    2024-02-01 05:38:47
  • LeetCode-160. 相交链表

    LeetCode-160. 相交链表

    于是有一个巧妙的思路诞生了,如果让短的先走完自己的再走长的,长的走完走短的,他俩就会正好对齐。如果让他们尾端队齐,那么从后面遍历就会很快找到第一个相交的点。

    2024-02-01 05:38:21