部分数据类型的大小以及转换说明符的用法

       首先对数据类型--整形的大小简单记录。整形分为char,short,int,long,long long五种(C99提供了long long int类型),在32位机器上,这五种类型分别占据内存空间的大小为1,2,4,4,8,单位:字节,但在16位和32位机器上,这五种类型的大小就可能会产生不同(char类型后续再讨论)。

       先拿16位机器来说,short占据2个字节,表达的数值表达范围通常为-2^15~2^15-1,unsigned short的数值表达范围通常为0~2^16-1;int类型占据2个字节,数值表达范围通常为-2^15~2^15-1,unsigned int的数值表达范围通常为0~2^16-1;long类型占据4个字节,数值表达范围通常为-2^31~2^31-1,unsigned long的数值表达范围通常为0~2^32-1。

类型大小(字节)数值范围
short2-2^15~2^15-1
int2-2^15~2^15-1
long4-2^31~2^31-1

        接着在32位机器上,short占据2个字节,表达的数值表达范围通常为-2^15~2^15-1,unsigned short的数值表达范围通常为0~2^16-1;int类型占据4个字节,数值表达范围通常为-2^31~2^31-1,unsigned int的数值表达范围通常为0~2^32-1;long类型占据4个字节,数值表达范围通常为-2^31~2^31-1,unsigned long的数值表达范围通常为0~2^32-1。

类型大小(字节)数值范围
short2-2^15~2^15-1
int4-2^31~2^31-1
long4-2^31~2^31-1

        最后就是在64位机器上,short依旧占据2个字节,表达的数值表达范围通常为-2^15~2^15-1,unsigned short的数值表达范围通常为0~2^16-1;int类型占据4个字节,数值表达范围通常为-2^31~2^31-1,unsigned int的数值表达范围通常为0~2^32-1;long类型占据8个字节,数值表达范围通常为-2^63~2^63-1,unsigned long的数值表达范围通常为0~2^64-1。

类型大小(字节)数值范围
short2-2^15~2^15-1
int4-2^31~2^31-1
long8-2^63~2^63-1

        其实,关于整形数据类型所能表达的数值范围是可以自行设置的,在头文件limits.h中,我们可以很容易的找到关于各数据类型的取值范围,如若需要我们还可以改变数值的取值范围。

         关于long long类型,在64位机器上,占据8个字节,表达的数值范围通常-2^63~2^63-1,unsigned long long的数值表达范围通常为0~2^64-1。

        在知道各类型所能表达数值范围后,我们就会发现当两整数相加,就可能会出现溢出的现象。当有符号的两数相加时,如若溢出,其结果是不确定的,可能仅仅是结果错了,也可能导致程序的崩溃,而无符号整型相加,其结果是确定的,例如无符号的16位数65535加1,其结果为0。

        在发生溢出现象时,我们首先考虑到的就是选用更大数值范围的类型,但这样做是不够的,我们还需要考虑改变类型对程序其他部分的影响,尤其是在printf和scanf这样的函数中,%d仅仅只能用来表示int类型,当出现无符号,短整,长整数时,需要一些新的转换符号。

        当类型为无符号整数时,采用%u,八进制输入输出时,用%o,十六进制用%x(这里简单说一下八进制和十六进制,同十进制相似,十进制逢十进一,八进制逢八进一,十六进制逢十六进一,十进制1234意为1×10^3+2×10^2+3×10+4,数字01234(八进制数字必须以0开头,每位数字都在0~7之间)意为1×8^3+2×8^2+3×8+4,数字0x1234(十六进制数字必须以0x开头,每位数字在0~9,a,b,c,d,e,f)意为1×16^3+2×16^2+3×16+4);当读写为short时,在d,u,o,x前加h,例如%hd,%hu,%ho,%hx;当读写长整数时,在d,u,o,x前加l,例如%ld,%lu,%lo,%lx;在读写为长长整数时,在d,u,o,x前加ll,例如%lld,%llu,%llo,%llx。

        接下来就是对转换说明符的一些记录。

        先说printf函数。在使用printf时,函数语句中的格式串会出现%d,%f,%u等等的转换说明符,但有些转换说明符不仅仅只有这些,还包含数字在里面,例如%5.3d,%6.5f等等,关于这些数字,我也简单说明一下。一般情况,转换说明可以用%m.pX格式或者%-m.pX来表示。m表示最小字段宽度即m指定了要显示的最少字符数量,我的理解为域宽,例如要显示123,%4d显示为 123(空格,1,2,3),就是最少都得显示的字符数量,当然显示的字符数大于m,字段宽度就会自动扩大为所需的尺寸;关于在m前放置一个‘-’,意为左对齐,无‘-’意为右对齐,例如123以%-4d打印为123 (1,2,3,空格);精度p依赖于转换说明符X的选用,有以下几种情况:

1.d--表示十进制,p表示待显示的数字的个数(必要时在数前加上额外的零),不写时,p默认为1 

2.e--表示指数形式的浮点数,p表明了小数点后数字的个数(默认为6),如果p为0,则不显示小            数点;

3.f--表示“定点十进制”形式的浮点数,没有指数。p的含义与e的一样;

4.g--表示指数形式或者定点十进制形式的浮点数,形式的选择根据数字的大小决定。p说明可以显示的有效数的最大数量。与转换说明符f不同,g的转换将不显示尾随的零,此外如果显示的数字没有小数点后的数字,小数点也不会显示。

例子如下:

         现在是scanf的一些介绍。当我们采用scanf输入时,scanf会从起始位置寻找数字,同时忽略空白字符(包括空格符,水平和垂直制表符,换页符和换行符),因此我们可以把数字放在同一行或者分散在多行内输入。

        举个栗子,如上图所示。在输入a,b,c,d的值时,在同一行输入和在多行输入都是可行的且结果一致。其原因在于:1.不管是分行输入,还是一行输入,scanf读取的时候就会把输入看成一个连续的字符流(例题中多行输入可简化为:··1\n······-20·······.3\n··-4.0e+02,其中 · 表示空格,\n表示换行);2.当scanf从起始位置读取输入时,会跳过空白字符;3.读取的时候要对照转换说明符,即读取整数时先寻找正负号(可选),然后读取数字直到非数字为止;读取浮点数时,也是先寻找正负号(可选),然后读取一串数字(可能含有小数点),再后是一个指数(可选)。当scanf函数遇到一个不可能属于当前项的字符时,它会把此字符放回原处,供scanf函数下次使用。因此上述例题便不难理解了。值得注意的是,当scanf函数转换说明符前有m时,代表获取数值的域宽,例如scanf("%4d",a),当我们输入12345时,scanf只会读取1234,5不会读取。

        通过上文对printf和scanf函数的描述,我们会发现这两个函数使用规则相似但不相同。因此,也就容易犯错,形如scanf("%d,%d",&a,&b),在我们使用这种输入时,输入的两数字必须用逗号隔开,才能输入正确。原因在于scanf会将输入内容与格式串内容对比,例如我的输入为3 ,5(意为:3,空格,逗号,5),3可以与%d匹配,空格不能和逗号匹配,输入和格式串不匹配,输入就会异常退出,只有把空格删除,两数字之间仅且仅有一个逗号,输入才能成功。因此使用scanf函数时,我们应该注意输入与格式串相对应。

        以上就是我目前对scanf函数,printf函数以及部分数据类型的了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值