| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 最最最详细的C语言教程笔记零起步(3)小白必备 同笔者一起学习 -> 正文阅读 |
|
[C++知识库]最最最详细的C语言教程笔记零起步(3)小白必备 同笔者一起学习 |
C语言教程笔记五.整型数据类型1. 整型数据类型在上一节当中,我们遇到了用int关键词(整数integer的缩写)来表示一个整数的数据类型。 这一节中,我们来详细讨论一下C语言里面的整数数据类型。
计算机通过晶体管的开关状态来记录数据。它们通常8个编为一组,我们称之为字节。而晶体管有 开 关 两种状态,一个字节有8个晶体管,因此一个字节可以拥有2的八次方个不同的状态。让每一种状态对应 一个数值,这样一个字节可以表示256个不同数值。 要表示更大的数据范围就需要更多晶体管。要知道在发明C语言的年代,计算机存储资源是非常珍贵而 稀缺的。对存储资源,程序员可能恨不得把一块掰成两块来用。如果只想表达0到100以内的数值,那么 一个字节就足够了,何必用两个字节来存储呢? 而如今,即使存储资源已经较为丰富了,但是大部分的强类型语言,都延续了这个传统。它们均提供了 丰富的类型以供选用。而程序员在编写代码时,通常能预想到需要使用到的数据范围的大小。这样在处 理一个数据时,可以从语言所提供的类型中选用最合适的类型来承载数据。 那么接下来,你可能想知道这些类型中,它们分别占用几个字节,具体的数据范围是多少?从而合适地 选择数据类型。很遗憾,我不能准确地告诉大家。因为C语言标准并未规定这些数据类型的大小范围, 具体的实现交由了编译器和平台决定。那我们怎样知道在visual studio 2019中,各种整型数据类型能够 表示的数据范围呢? 2. 用sizeof关键词来测量大小和int一样,sizeof 是C语言中的一个关键词。它是英文 size of 连起来的合成词。翻译成中文就是什么东西的大小的意思。它能够测量C语言各种实体所占用的字节大小。 如果我们想看int所占用的字节大小,可以这样写sizeof(int)。执行后这段代码后,它的测量结果是一个 整型。我们可以借助printf函数将测量结果显示在控制台上。我们现在可以假设sizeof返回的结果是int类型的,在printf函数中使用占位符**%d**。而更准确地用法,应该用**%zu**。 printf("%d\n", sizeof(int)); sizeof 后面既可以跟类型,也可以跟变量、常量。
现在可以在自己的电脑运行一下,看看C语言中提供的各种整型类型的大小。
char,short,int,long,long long 分别占用了1,2,4,4,8个字节。至此,我们已经得知了它们所占 字节大小,并且验证了可以表示越大范围的数据类型所占用的字节越多。 值得注意的是在Visual Studio 2019中,int和long均占用4个字节。这并未违反C语言标准,C语言标准规定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。 3. 三位二进制表示的数值范围TIPS: 如果暂时无法理解关于整型表达范围的原理分析,请先记住sizeof的使用和各种整型变量的表达范围的 结论即可。不理解整型表达范围的原理不影响对C语言的使用。 char,short,int,long,long long分别占用了1,2,4,4,8个字节。而每个字节由8个晶体管组成, 每个晶体管状态我们称之为位。那么char,short,int,long,long long分别占用了8,16,32,32,64 位。 太多的位不利于我们理解原理,我们暂时把问题简化一下,试试看位数减少到3。然后,分析3位的组 合,它能表示多大范围的数值呢?
如果不考虑负数,那么整型数据类型可以表达的数据范围是: 假设,位数为n,则数据范围从【0】开始,到【2的n次方-1】的数值范围。 负数怎么办?那就需要拿出一个位来作为符号位。用来表示这个数据是 正数 还是 负数 。在IEEE标准中,这个符号位存在于二进制的最高位。让我们用三位二进制来示范这种情况。 加上符号之后,现在取值范围变为负4到3了。红框中的为最高位,最高位为1的表示负数。你可能会觉 得有点奇怪,为什么3的二进制是011,而负3却是101呢?如果简单的加一个符号位,为什么不用111 呢?那我们看看如图中所示的3与负3相加的运算结果。 4. 数值补码表示法
求一个正数对应的负数的补码的第二种办法:
5. 各种整型类型的数值范围是多少(包括无符号整型)六.浮点数据类型1. 处理带小数的数值(float)类似于1.234567,0.00001,这类非整数的数据。int能不能装这些数据呢?
这时候就需要引入新的数据类型了——浮点类型。 把上面代码中的整型 int ,用单精度浮点型 float 替代。 之后,再将 printf("%d\n",a); 中的占位符是 %d ,所以我们用 %f 替换。( %d 占位符用于整型, %f 占 位符用于浮点型) 替换完成之后,再来试试看
这是因为,浮点数并不能表示无限的精确,它会存在着一定的误差。 2. 浮点类型:double有没有比float,精度更高的类型呢?有的,叫做双精度浮点型 double 。把上面代码中的 float 换 成 double 。 那么 printf函数 中使用的占位符需要修改吗?
3. 浮点类型所占字节大小按照之前对整型的经验,越大范围的整型类型所占的空间越大。 那么对于浮点类型来说,越高精度、越大范围的浮点类型,应该也会占用越大的空间。 用sizeof来测量一下float和double分别占用多大的空间。
七.C语言的变量与常量1. 变量与常量在整个程序的运行过程中,没有变化且不能变化的,我们称之为常量。 在程序运行期间,可以改变并且有可能会改变的,我们称之为变量。 2. 声明变量在前几节中,已经接触过如何声明一个变量:
声明变量的公式:类型 + 标识符 + 分号 标识符:由我们自己命名的一个标识,用于表示一个变量、函数或其他实体的名称。 例如:上面的代码 中s,n,l,f,d是由我们自己命名的一个标识,用于表示一个变量。 标识符必须经过声明或定义才能正常被编译器识别,而关键词可以直接使用。 因此,要让标识符被编译器看做是一个变量,必须将标识符在使用前声明为一个变量。 接下来举几个例子: 正确, 变量使用前被声明:
错误, 变量a未声明:
错误, 变量不应该在声明前使用:
3. 变量名命名规则声明变量的公式:类型 + 标识符 + 分号 既然变量名是一个标识符,因此变量名必须符合标识符的命名规则。
4. 变量初始化和赋值4.1 初始化和赋值下面的代码,它的打印出来的数值是多少呢?
突然发现,它居然报错了!
写法1:变量声明后,立刻初始化。
写法2:变量声明后,不初始化。后续使用赋值运算符赋值。
4.2 初始化和赋值的区别赋值: 初始化: 可以用赋值运算符左边的不同来区分赋值与初始化。 多次初始化的写法相当于将变量a 声明了两次,在第二次声明变量a 时,编译器发现标识符a已经被使用过了,便会报告一个编译错误。
目前看来,初始化好像就是把变量声明和赋值写在一行了,对于整型和浮点变量确实如此。 但是,对于后面将见到的其他类型,会略有不同。请区别对待初始化和赋值,这两个概念。 5. 常量常量是程序中,一开始就被写死在代码中,且不能被改变的量。 5.1 字面常量例如:100,200,1.3344,“HelloWorld”,被称之为字面常量。 字面常量不需要声明,并且编译器通过它的写法可以立即判断出它的类型。
错误,常量不能被更改
错误,常量不能被更改 被双引号包裹的称之为字符串字面常量。
错误,常量不能被更改 5.2 字面常量类型一个变量的类型在声明的时候被确定。而一个常量的类型,在这个常量写在代码中时也能被确定。 整数字面常量通常是 int 类型的,除非这个整数字面常量数值过大,超过了 int 类型的范围,那么编译器会尝试将它看做 unsigned int 类型。如果更大,那么依次类推为更大范围的整型类型,例如 long , unsigned long , long long , unsigned long long 。
由于,Visual Studio 2019中,int与long的范围一致,因此会跳过long,而尝试使用long long 或 unsigned long long。 带小数的字面常量为 double 类型。 5.3 符号常量
定义了一个符号常量 PRICE 。这样做有什么好处呢? 比如,这个程序很庞大,商品的价格不仅仅被用在 main 函数中,还被用在其他很多函数里面。 定义符号常量的公式:
八.字符常量及字符变量1. 字符常量字符串是由什么组成的呢? 字符 如果我单独用字符来打印 HelloWorld ,将代码按照如下方式修改:
这样看上去,的确是在一个个地输出字符。但是,要注意,字符串是用双引号包括的。也就是说, 这上面输出的仍然是字符串,只不过每一个字符串仅包含一个字符。 那怎样,用单个字符的形式来输出呢? 定义:字符常量由单引号包括。
答案是不行的,这样会导致编译报错。因为, printf的第一个参数必须是字符串 。 既然如此,我们考虑是否能用 printf 函数的占位符来给字符占位呢?
2. 探究字符类型占用空间现在用 sizeof 来探究一下,字符类型在计算机内部所占用的空间大小。 2.1 字符常量的大小
在Visual Studio中,如果你使用后缀名c为后缀名,将使用C编译器。而使用cpp为后缀名,将使用 C++编译器。 字符类型常量在C编译器将常量看成整型,因此占4个字节。而在C++编译器中只占1个字节。 2.2 字符变量的大小
3. 错误导致的意外收获在前面的代码中,使用 %c 作为字符类型的占位符。假如不小心用错了占位符,使用了整型占位符 %d ,会发生什么呢?
4. 整数与字符的对应关系——ASCII计算机没必要直接存储字符,可以用某个数值来代表某个字符。 而这个映射关系,被称作美国信息交换标准代码(American Standard Code for Information Interchange)。我们一般将其简称为 ASCII 。 ASCII 设计的时候,仅仅考虑了拉丁字符,0到127分别对应一个字符。而一个字节最多可以表示256个 数,所以,字符类型仅需要一个字节就能正常存储。刚刚用 sizeof 计算出字符类型占用一个字节 的大小也应验了这个设计。 5. 字符类型与字符变量字符在计算机内部用整数表示,并且只需要用到0至127的整数范围。 若要显示成实际的字符,由printf函数根据占位符 %c 将其转换为真实的字符并打印在控制台上。 定义一个字符变量
用字符占位符,打印这三个变量。输出结果为三个字符。
用整型占位符,打印这三个变量。输出结果为这三个字符在ASCII中所对应的数值。
6. 探究字符串常量占用空间接下来,我们来探究一下字符串所占用的字节空间的大小。
7. 字符零与数值零既然零表示字符串结束,我们尝试在字符串里面故意添加零,强行让字符串结束。
零被当成字符正常输出了。其实,这也是可以遇见的一个结果。如果零不能被正常输出,那就 连"100"这种字符串都无法正常打印。 让我们再仔细观察一下ASCII表中的字符 0 ,它对应的数值其实是十进制的 48 。 8. 转义字符那怎样表示数值 0 呢,需要再次尝试代码。
\数值 被称作转义字符 。 转义字符虽然写法上有多个字符,实际上它对应ASCII表中的一个字符。 那现在尝试直接使用数值来打印字符串Hello,注意哦,斜杠后面跟着的是八进制数值。
由于记数值是比较麻烦的,为了方便使用一些常用到的数值可以用字母来替代。 例如: 有一些字符无法直接在键盘上输入,这一类字符被称为 不可见字符 。就像上面的表中列出的字符,这些字符可以用斜杠加数值来表示,也可以使用斜杠加助记字母来表示。 但是不是所有的不可见都有助记字母,所以尽可能还是需要查表来获得这些字符所对应的数值。 点个赞吧? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 4:32:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |