C/C++常用知识
C/C++常用知识
###################################################
# C/C++是需求最大的语言
# 供应量java与C/C++比例100:1。
# 如果学习好C++语言其他语言一两天或者一周都可以搞定了。
# 因此,C++方向是号称皇族语言,在这个基础上都是小儿科。
#
# C/C++是最根本计算机语言
# a)操作系统与驱动程序,必须使用C语言开发。
# b)windows所有桌面软件,都是使用C++开发。
# 比如:浏览器,Office,QQ,微信客户端。
# c)C#只能开发简单windows桌面程序,几乎没有专业软件用C#开发。
# unity 3d开发配套C#语言的,UE4 配套C++。
# d)网站后台开发:java、python速度比较慢,go最新修行也开发网站速度。
# 谷歌开发科学家集团军,每天有大量的时间自由研发喜欢的东西。
# e)go语言就是在这种情况下诞生的,能够达到C/C++速度快以及灵活开发全面功能软件。
# go又有java、C#和python的简易语言的特点。
# f)app开发:C++的Qt和java的andriod Studio(谷歌配套安卓的专门编译器)
#
# C/C++是最好的起点语言
#
# 使用VS创建三类主要软件工程
# a)控制台软件,是没有Windows的年代最古老的软件模式。
# b)简易Windows软件(以前叫做Win32软件,基于C语言语法)
# c)高级Windows软件(MFC 基于C++语法和类库开发)
#
# 实例:新建一个 HelloC 的项目
###################################################
#include <stdio.h>
int main()
{
# puts("Hello C!");
printf("Hello C!");
return 0;
}
###################################################
# 在命令行窗口运行
HelloC.exe
###################################################
# puts和printf的区别:
# a)puts与printf的区别是:printf比puts多了一个换行;
# b)printf能够打印更多复杂的混合数据打印(后面几天内学习)
###################################################
# 计算机单位:
# a)1K=1024
# b)1M=1024K(兆)
# c)1G=1024M
# d)1T=1024G
###################################################
# scanf的功能:在控制台中输入数据到变量。
# a)%后跟d,x,o:代表十进制、十六进制和八进制。
# (C语言不支持二进制)
# b)变量前面的 & 符号:代表取出这个变量的地址。
# c)scanf在执行的过程,沿着取出的地址把控制台用户录入的数据送到变量中。
# c)如果不去地址,或者地址给错会造成软件崩溃;
###################################################
# 程序调试:主要是按F10快捷键
# a)调试之前的状态叫做编辑状态,没有监测与自动变量之类调试相关窗口。
# b)当第一次按下F10之后就进入了调试状态,很多调试窗口都出来了(参见调试菜单)
# c)最重要的调试窗口包括:自动窗口、监视1-4,内存1-4,汇编显示。
# 观测程序每一步执行之后发生的现象
###################################################
# 调试能力是程序员最重要的能力:
#
# gcc和qt的调试能力都很弱,VS对于观测内存数据以及分析问题都是最优秀的工具。
# VS的调试功能介绍:
# 1、进入调试状态:
# a)按F10或F11都可以直接进入到main函数的第一行。
# b)设置断点之后按F5直接程序运行到断点处,然后按F10等继续调试;
# c)如果不想设置断点,可以把光标停在某个代码行然后按Ctrl+F10程序会运行到光标的文字停止;
# d)设置断点(F9)再按F5快捷键与Ctrl+F10的效果类似,程序一下子运行断点处。
# 2、调试状态的相关窗口:
# a)监视:可以拖动或者收入变量进行观测;
# b)内存:可以观测一整块内存上几个变量的变化过程;
# c)自动窗口:程序走到哪一行,就把改行的上一行和本行用到的变量都显示出来(数值和地址)
# 自动窗口还能够看到上一次函数执行的结果(return返回值)
# d)局部变量:类似于自动窗口
# e)断点管理器:可以清理大量的断点
# f)调用堆栈:可以清晰地看到当前各个被调用的函数的层次管系统,
# 点击任何一个层次的函数都可以看到函数内的变量变化情况
# 3、调试相关的快捷键:
# a)F10单步跟踪(逐过程):不进入模块内部,跨过去;
# b)F11单步跟踪(逐语句):进入到模块内部详细查看执行过程。
# c)Shift+F11(跳出):迅速执行完并离开代码模块;
# d)Shift+F5:终止调试
# 4、输出窗口:
# a)编译时可以看到所有出错代码所在的函数和错误原因;
# b)双击某个错误报告,可以看到发生错误的函数所在位置;
# c)按F4快捷键可以轮流查看出错的代码;
# d)另外程序运行过程的数据变化过程,可以通过调用OutputDebugString函数输出到这个调试窗口
# 5、printf的理解:
# a)静态数据与动态数据混合输出;
# b)动态数据就是百分号加一个字母(%d或%x等);
# c)其余全部是静态数据输出;
# 6、代码注释:一般适用于编写对代码的说明
# a)单行注释://
# b)多行注释:
# /*
# ...CRT : C Runtime Library:C语言运行库(各种函数)
# ..sdfsdf
# klg;sdg
# ;gsdgh;
# */
###################################################
# 清理项目下的垃圾文件
# 1.vs代码(删除编译产物)
# 2.*.db
# 3.debug
# 4.ipch
###################################################
# 1.二进制简单分析:
# a)一个位只能表达:0和1
# b)2个位能表达4种(0到3之间):00 01 10 11
# 00+1 = 01
# 01+1 = 10
# 10+1 = 11
# c)3个位能表达8种(0到7之间):000 001 010 011 100 101 110 111
# d)以此类推:4个位16种数字(0-15):
# 0000 0001 0010 0011 0100 0101 0110 0111
# 1000 1001 1010 1011 1100 1101 1110 1111
# 2、快速分析二进制:
# a)根据第几个位置有1进行累加:二进制(1101) = 8+4+0+1 => 13
# 二进(1111)=8+4+2+1 => 15
# 1 = 1
# 10 = 2
# 100 = 4
# 1000 = 8
# 10000 = 16
# 100000 = 32
# 1000000 = 64
# 3、快速试探二进制:用常见的纯2的n次方来拆分
# 十进制(35) 32 + 2 + 1 = 100011
# 十进制(53) 32 + 21 -> 32 + 16 + 5 > 32 + 16 + 4 + 1 = 110101
# 4、常见的二进制边界
# a)4位 0到15之间
# b)8位(1字节):0到255之间
# c)16位(2个字节):0到65535之间(65536叫做64K,刚好是64*1024)
# 2的3次方乘以2的5次方:8*32 = 256(2的8次方)
# d)32位(4个字节):0到?4294967295?之间
# (?4294967296=4G)
# 1024是10个位,3个1024就是30个位,剩余2个位就是4
# 30个位就是1G,31个位就是2G,32个位就是4G
###################################################
# 实例
############################
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n;
printf("请输入1个十进制数字:");
# 不能有静态数据,会提示错误
# 例如 scanf("我是一个静态数据%d", &n);
scanf("%d", &n);
printf("你录入的数据是:%d\n", n);
return 0;
}
###################################################
# 实例
############################
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main()
{
int n = 0, m = 0;
printf("请输入2的指数:");
scanf("%d", $n);
m = pow(2, n);
printf("2的%d次方是:%d\n", n, m);
return 0;
}
###################################################
# 常量
#
# 常量是指在程序运行时,不会被修改的量。通俗地说,常量就是指C语言中各种数字的表达式。
# C语言常量包括:整数常量、浮点数常量、字符常量和字符串常量。
#############################
# 整数常量
# 整数常量的表达方法包括:十进制表达式、十六进制表达式、八进制表达式等。(注意:C语言并没有提供二进制常量表达式)
# a)十进制表达式:和普通数字的表达方法一致。例如:13,28,-52,-1000等等;
# b)十六进制表达式:以0x开头。例如:0xA1,0xC8,-0x20,-0x500等等;
# c)八进制表达式:以0开头。例如:032,-011,081(错误)等。
# 注意:0开头的常量看上去好像是十进制,其实已经是八进制了,八进制中只有0-7之间的数字,8和9都错误的代码。
#############################
# 浮点数常量
# 浮点数常量,通俗地说就是带小数点的数字,表达式的中必须含有小数点,即使小数部分是0也要缺省带小数点。浮点数常量主要有两种表达式:
# a)单精度浮点数:尾部带f的浮点数代表是单精度浮点数。例如:0.5f,88.2f,-55.0f等;
# b)双精度浮点数:尾部不带f的浮点数代表是双精度浮点数。例如:0.0,0.88,99.5,-111.356等。
# 一般认为双精度浮点数比单精度浮点数表达的范围要大很多,包括整数部分和小数部分,双精度表达的数字长度要大很多。
#############################
# 字符常量
# 字符常量,是由一对单引号将一个字符括起来的构成,每种被括起来不同的字符代表一个不同的数字。就如同每个学生有不同的名字,而且还有个不同的学号一样。
# 例如:char c = 'A';
# 'A'代表的是一个数字65,因为在ASCII编码表中A的数值是65,
# 依此类推:' B'代表66,'a'代表97,'X'代表88,'5'代表53,'='代表61,'|'代表124,' '空格代表32等等。
# 因此,字符常量实际上也是一种整数常量,只不过字符常量所表达的范围比较小而已。
#############################
# ASCII编码表
#
# ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)
# 是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统。
# 所有字符与数值的对照表就是ASCII编码表,作为字符常量使用的ASCII编码主要是使用0-127范围内的数字。
# 其中0~31及127(共33个)是控制字符或通信专用字符,其余为可显示字符。
#############################
# 转义字符
# 在C语言中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符。 例如:char c = ‘\n’;
# 其中’\n’的码值是10,代表被打印输出时代表换行"new line"的意思。依此类推还有:’\t’的码值是9, 代表被打印输出时间隔一个TAB距离"Table"等等。
# 所有的ASCII码都可以用“\”加数字(2位的16进制数字或3位的8进制数字)来表示。
#############################
# 字符串常量
# 字符串常量,是由一对双引号括起来的字符集合。例如,以下都是合法的字符串常量:
# "how do you do.";
# "我是吕鑫老师";
# "a";
# "$123.45";
# 字符串是唯一的一种存在与内存空间上的常量,它是一个内存上的某个地址。字符串内所有的字符依次存储在内存中一块连续的区域内,
# 并且把空字符'\0'自动附加到字符串的尾部作为字符串的结束标志。因此,字符个数为n的字符串在内存中应占(n+1)个字节。
# 使用printf可以输出字符串,例如:printf("how do you do.");
#############################
# 字符串常量与字符常量的对比
# a)字符常量是由一对单引号括起来的单个字符,而字符串常量是一对双引号括起来的字符集合;
# b)字符常量本质上是一个数字,这个数字对应了ASCII表内的一个字符;
# c)而字符串常量本质上是一个字符集合的内存地址,打印时从头部一直遍历到结尾符结束;
# d)不能将字符串与字符常量混淆,字符常量可以赋值给字符变量或其他整型变量;
# e)不能把一个字符串常量赋给一个字符变量或者其他整型变量。
#
# 例如:char b='a';(正确) char b= "a";(错误)
###################################################
# 变量
#
# C语言变量,是指内存空间中的一段存储区域,可以用于存放和读取一定大小的数据。每个变量都在内存中有一个独立的地址,
# 在变量有效期内变量的地址一直保持不变。
###########################
# 变量命名规则
#
# 编译器对变量的命名是有一定要求的,如果不符合变量命名规则会编译时就会出错。
# a)变量名只能是字母(a-z A-Z),数字(0-9)与下划线(_)的组合,并且之间不能包含空格;
# b)变量名首字母必须为字母(a-z A-Z)或者下划线(_),数字不能放在变量名首位;
# c)变量名不能使用关键字做变量名,比如:for、while、case、break等关键字等。
##############
# 实例: 测试变量命名及变量地址
#include <stdio.h>
int main()
{
int a1 = '\n';
float _f1 = 677.124568;
printf("a1=%d,a1的地址是:0x%x\n",a1,&a1);
printf("_f1=%f,_f1的地址是:0x%x\n",_f1,&_f1);
return 0;
}
##############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a)添加一些新的变量名,违反以上三种变量命名规则时查看是否编译出错;
# b)在运行结果中,查看a1与_f1两个变量地址相差的距离。
#
# 另外,除了编译器对变量的命名有要求外,各个软件开发公司往往还有额外的代码规范。网上流传最多的就是匈牙利命名法,
# 该命名法是在每个变量名的前面加上若干表示数据类型的字符。基本原则是:变量名=属性+类型+对象描述。
#
# 例如:int m_nAge;
#
# m_代表成员变量,g_代表全局变量。n代表该变量是一个整型变量,Age代表这个变量是用来记录年龄的。
# 更详细的匈牙利命名法或者公司代码规范,可以通过网上搜索,这里只做简单介绍。
##############
# 变量分类
#
# 根据当个变量的空间长短可分为:
# a)字符型变量(1个字节):char类型、unsigned char类型;
# b)短型变量(2个字节):short类型、unsigned short类型;
# c)长型变量(4个字节):int、unsigned int(或long、unsigned long)或float类型以及指针变量等;
# d)超长型变量( 8个字节):double类型、__int64或long long等。(有些编译器不支持__int64类型,有些编译器不支持long long)
#
# 根据类型可以分为:
# a)整数型变量:包括char、 unsigned char、short、 unsigned short、int、 unsigned int(或long、unsigned long )以及 __int64或long long等。
# b)浮点数型变量:float类型(单精度)、double类型(双精度);
# c)其他变量类型:数组变量、指针变量以及结构体对象等。
#
# 变量的存储原理
# 4个位的二进制数,刚好表达的是十六进制数字的个位数。如果再加4个位就是8位,刚好表达的就是十六进制的两位数。计算机以8个位代表一个字节,
# 表达的数字是0x00到0xFF之间的数字,也就是从0到255之间总共256个数字,就像十进制中的两位数是0到99总共100个那样。
#
# 1.单字节(8位)变量
# 单字节变量也叫8位变量,包括unsigned char和char两种类型,都属于整型变量。unsigned char:无符号单字节变量,存储范围是0-255(0xFF)。
# char:有符号单字节变量,存储范围是-128到0到127之间的数。
# 对于unsigned char类型变量,毫无疑问只要在8个位不同的位置上存储1或0,就能得到0-255之间256种组合后的数字。
# 为了让char类型存储的256种数字中,一半是正数一半是负数,计算机将char类型变量中的最高位作为符号位。最高位为0的是正数,最高位为1是负数。
# 最高位是0时最大的数字就是0x7F,转成二进制就是0111 1111。对这个二进制或者十六进制数加1,就会出现最高位为1的数字,即:0x80(1000 0000)。
# 很明显,十六进制0x80作为中间点,左右各有一半的十六进制数字,就如十进制中50是0到100之间的中间值。0x80对应的十进制是128,0到127之间都是正数区域,从128开始对于char类型变量则开始变成负数了。
# 那么如何将负数区域的十六进制或二进制数字,转换为一个对应十进制的负数呢?先编写点代码来测试一下。
##############
# 实例: 测试8位变量的存储特点
##############
#include <stdio.h>
int main()
{
char c = 129; //有符号(有负号): 0-127 -1 到 -128
unsigned char u = 255; //无符号:0-255
printf("u=%d\t c=%d\n",u,c);
u = 0x8887F; //溢出 之后只留1个字节
c = 0x88877F; //溢出
printf("u=%d\t c=%d\n",u,c);
u = 256; //0x100 //溢出
c = 256;
printf("u=%d\t c=%d\n",u,c);
u = 511; //0x1FF
c = 511; //0x1FF
printf("u=%d\t c=%d\n",u,c);
u = u + 1;
c = c + 1;
printf("u=%d\t c=%d\n",u,c);
u = 250;
c = 250;
printf("u=%d\t c=%d\n",u,c);
u = -1; //-1+256
c = -1;
printf("u=%d\t c=%d\n",u,c);
return 0;
}
##############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a)观察有符号与无符号单字节变量,打印出来的结果是整数还是负数;
# b)最好能在程序运行过程中,在监视器中观测变量内数值的变化;
# c)根据观测结果,思考和总结正负数在两种变量中存储后的结果是怎样的?
# 经过观察和总结,char类型变量的存储原理是:
# a)对char类型变量n赋值一个0-127范围内的正整数x,n获得的就是原值x不发生任何变化;
# b)对char类型变量n赋值一个128-255范围内的正整数x,n获得的是一个负数x-256;
# 例如:char c=129;//此时c的数值自动转为-127(129-256)
# c)对char类型变量n赋值一个大于255的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留1个字节的数据,也就是将x对256取余数(x%256)之后的结果,再按照以上a和b两条执行。
# 经过观察和总结,unsigned char类型变量的存储原理是:
# a)对unsigned char类型变量n赋值一个0-255范围内的正整数x,n获得的就是原值x不发生任何变化;
# b)对unsigned char类型变量n赋值一个-1到-128的负数 x,n获得的负数数值自动转为一个正整数x+256;
# 例如:unsigned char u = -1;//此时u的数值自动转为255(-1+256)
# c)对unsigned char类型变量n赋值一个大于255的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留1个字节的数据,也就是将x对256取余数(x%256)之后的结果,再按照以上a和b两条执行。
############################
# 2.双字节(16位)变量
#
# 双字节变量也叫16位变量,包括unsigned short和short两种类型,都属于整型变量。双字节变量与上一节的单字节变量,在存储原理上基本一致,只是存储空间整整大了一倍。
# unsigned short:无符号双字节变量,存储范围是0-65535(0xFFFF) ,就像十进制中的4位数是从0到9999总共10000个那样。
# short:有符号双字节变量,存储范围是-32768(0x8000)到0到32767(0x7FFF)之间的数,其中0x8000是正负数的分界点。
# 为了让short类型存储的65536种数字中,一半是正数一半是负数,计算机将short类型变量中的最高位作为符号位。最高位为0的代表正数,最高位为1代表负数。
##############
# 实例: 测试16位变量的存储特点
##############
#include <stdio.h>
int main()
{
short s = 0xFF;
unsigned short u = 0xFF;
printf("s=%d,u=%d\n",s,u);
s = 0x7FFF;
u = 0x7FFF;
printf("s=%d,u=%d\n",s,u);
s = s + 1;
u = u + 1;
printf("s=%d,u=%d\n",s,u);
u = -16;
s = -16;
printf("s=%d,u=%d\n",s,u);
u = 65535;
s = 65535;
printf("s=%d,u=%d\n",s,u);
u = 0xabcd;
s = 0xabcd;
printf("s=%d,u=%d\n",s,u);
return 0;
}
##############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a)观察有符号与无符号双字节变量,打印出来的结果是整数还是负数;
# b)最好能在程序运行过程中,在监视器中观测变量内数值的变化;
# c)根据观测结果,思考和总结正负数在两种变量中存储后的结果是怎样的?
# 65536刚好是64×1024的结果,因此我们在书写上也经常用64K来表示65536。
# 经过观察和总结,short类型变量的存储原理是:
# a)对short类型变量n赋值一个0-32767范围内的正整数x,n获得的就是原值x不发生任何变化;
# b)对short类型变量n赋值一个32768-65535范围内的正整数x,n获得的是一个负数x-64K;
# 例如:short c=65530;//此时c的数值自动转为-6(65530-65536)
# c)对short类型变量n赋值一个大于65535的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留2个字节的数据,也就是将x对64K取余数(x%64K)之后的结果,再按照以上a和b两条执行。
# 经过观察和总结,unsigned short类型变量的存储原理是:
# a)对unsigned short类型变量n赋值一个0-255范围内的正整数x,n获得的就是原值x不发生任何变化;
# b)对unsigned short类型变量n赋值一个-1到-32768的负数 x,n获得的负数数值自动转为一个正整数x+64K;
# 例如:unsigned short u = -32767;//此时u的数值自动转为32769(-32767+64K)
# c)对unsigned short类型变量n赋值一个大于32767的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留2个字节的数据,也就是将x对64K取余数(x%64K)之后的结果,再按照以上a和b两条执行。
############################
# 3.四字节(32位)变量
#
# 四字节整型变量也叫32位变量,包括unsigned int和int(或unsigned long和long)等类型。四字节变量与单字节和双字节变量,在存储原理上基本一致,只是存储空间更大了。
# 在32位以上的C语言编译器中,long与int两种变量类型是重复的,两者的功能和特性完全一致。在早期的16位C语言编译器中,int类型原本是与short类型一致的。
# unsigned int:无符号四字节变量,存储范围是0-4294967295(0xFFFFFFFF) ,就像十进制中的8位数是从0到99999999总共100000000个那样。
# int:有符号四字节变量,存储范围是-2147483648(0x80000000)到0到2147483647(0x7FFFFFFF)之间的数,其中0x80000000是正负数的分界点。
# 4294967296刚好是4×1024×1024×1024的结果,因此我们也经常用4G来表示4294967296,用2G来表示2147483648。
# 为了让int类型存储的4G种数字中,一半是正数一半是负数,计算机将int类型变量中的最高位作为符号位。最高位为0的代表正数,最高位为1代表负数。
###############
# 测试32位变量的存储特点
##############
#include <stdio.h>
int main()
{
int i = 0xFF;
unsigned int u = 0xFF;
printf("i=%d,u=%d\n",i,u);
i = 0xFFFF;
u = 0xFFFF;
printf("i=%d,u=%d\n",i,u);
i = 0x7FFFFFFF;
printf("i=%d,u=%d\n",i,u);
i = i + 1;
u = 0x80000000;
printf("i=%d,u=%d\n",i,u);
i = 0xFFFFFFF0;
u = 0xFFFFFFF0;
printf("i=%d,u=%u\n",i,u); //注意这一行有一个%u
return 0;
}
##############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a)观察有符号与无符号四字节变量,打印出来的结果是整数还是负数;
# b)最好能在程序运行过程中,在监视器中观测变量内数值的变化;
# c)根据观测结果,思考和总结正负数在两种变量中存储后的结果是怎样的?
# 经过观察和总结,int类型变量的存储原理是:
# a)对int类型变量n赋值一个-2G到2G-1之间的整数x,n获得的就是原值x不发生任何变化;
# b)对int类型变量n赋值一个从2G到4G-1范围内的正整数x,n获得的是一个负数x-4G;
# 例如:int i=4294967295;//此时c的数值自动转为-1(4294967295-4294967296)
# c)对int类型变量n赋值一个大于4294967295(4G-1)的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留4个字节的数据,也就是将x对4G取余数(x%4G)之后的结果,再按照以上a和b两条执行。
# 经过观察和总结,unsigned short类型变量的存储原理是:
# a)对unsigned int类型变量n赋值一个从0到4G-1范围内的正整数x,n获得的就是原值x不发生任何变化;
# b)对unsigned int类型变量n赋值一个-1到-2G的负数 x,n获得的负数数值自动转为一个正整数x+4G;
# 例如:unsigned int u = -10;//此时u的数值自动转为4294967286(-10+4G)
# c)对unsigned int类型变量n赋值一个大于4294967295(4G-1)的x,就形成了数据存储的溢出。这时要去除掉溢出部分,保留4个字节的数据,也就是将x对4G取余数(x%4G)之后的结果,再按照以上a和b两条执行。
############################
# 4.浮点型变量
#
# 浮点型变量就是用于存储带有小数的数据的变量,分为单精度(float)与双高精度(double)两种类型。一般浮点型变量不与unsigned关键字连用,缺省是有符号变量。
# 浮点型变量的存储结构比较复杂,本节主要讨论float和double类型的存储范围。
# Float类型的指数位有8位
# 而double类型的指数位有11位
# float类型是4个字节(32)位变量,总共有6到7位的有效精度。(2^23 = 8388608)
# double 类型是8个字节(64)位变量,总共有15-16位的有效精度。(2^52 = 4503599627370496)
###############
# 测试浮点数的存储范围
###############
#include <stdio.h>
int main()
{
char ch = 99;
int n = 1234567890;
float f = 12345678.123456789f;//0.123456f
double d = 1234567890.1234567890;
//0.01234567890123456789;//1234567890123456.0;
printf("c=%c,n=%d,f=%f,d=%0.20lf\n",ch+5,n,f,d);
printf("sizeof(ch)=%d, sizeof(n)=%d, sizeof(f)=%d, sizeof(d)=%d\n",
sizeof(ch), sizeof(n), sizeof(f), sizeof(d));
//最后一行是打印所有类型变量的大小(字节数)
return 0;
}
###############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a)观察float与double类型变量,打印出来的数据精度是否有损失;
# b)最好能在程序运行过程中,在监视器中观测两种浮点数变量内数值的变化;
# c)修改两种变量赋值数据的总长度以及小数点所在的位置,总结两种变量有效精度的长度。
############################
# 5.八字节整型变量
#
# 整型变量中还包括8字节(64位)整型变量,是不常用的变量类型。例如:__int64或long long(有些编译器中不支持__int64,有些编译器不支持long long)。
# printf函数输出64位数的语法,在window下和linux下是不一样的。
# windows下是大写I再加64d或64u:
printf("%I64d/n",a);
printf("%I64u/n",a);
# linux下是两个小写l在d或u:
printf("%lld/n",a);
printf("%llu/n",a);
###############
# 测试64位整型变量
###############
#include <stdio.h>
int main()
{
long long i =0x80000000;
unsigned long long u = 0xFFFFFFFF;
printf("i=%I64d,u=%I64u\n",i*5000,u*u);
return 0;
}
###############
# 将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
# a) 用windows计算器对要打印的乘法算是进行校对,查看打印出来的数据是否有损失或错误;
# b)最好能在程序运行过程中,在监视器中观测两种64位整型变量内数值的变化;
# c) 用windows计算器对有符号和无符号64位整型变量的取值范围进行推算。
###############
# 测试64位整型变量的结果是:
# a)i*5000还远远没到最高位为1的负数区间;
# b)u*u则还是差一些没有达到64位数的最大值。
# C语言中基本变量类型,主要就是整型变量与浮点数变量两大种类。
# 另外还有一些高级变量将在后续章节中继续介绍,例如:数组变量、指针变量、结构体变量以及枚举变量等。
posted on 2020-03-17 08:58 herisson_pan 阅读(20) 评论(0) 收藏 举报
浙公网安备 33010602011771号