如何定义和输出不同类型的数据与强制转换

我们输出的时候常常会有用到%d%f%u等占位符,那么什么时候用%d,什么时候用%f呢?这就要看数据的类型了,不同类型的数据输出时使用的也不同,如果对应错误可能会导致报错或者运算错误,所以本篇文章我们就来讨论数据的类型和其对应的输出方式。

数据的类型大致分为整形,字符型,字符串型(大部分书上没有单独讲,本人自行提取出来的),浮点型,布尔型。而当我们使用的时候也可以使用强制转换来对其类型进行转换。

1整型

整形,顾名思义也便是整数,没有小数的数。

一般我们定义整形有四种大致的方式,一是short int(int可删除)二是int,三是long int(int可删除),四是long long int(int可删除)。从名字上可以看出,三者的差别就是其“长度”的不同,而且从左往右,右边的总大于等于左边的。

这种长度有两种含义,一是他们的取值范围长度,short int的取值范围是-2的7次方到2的七次方-1,int的取值范围是-2的31次方到2的31次方-1,long int的取值范围是-2的31次方到2的31次方-1(和int同),long long int的取值范围是-2的64次方到2的64次方-1。如果输入的值不在所选的定义的取值范围中就会报错。

二是他们的字节长度(单位为字节B),short int的长度为2,int的为4,long int的为4(和int同),long long int的是8。(c语言规定这些“长度”long long int>long int>=int>short int,所以上面的int和long int同)

如果再前面四种上带上符号(对于整形就是正负号,有符号就是取值可以为负,无符号就是取值只能为非负整数,即正整数和零)每种还能再分出两种,一种是signed(有符号)的有符号的和以上的一样,如果前面带上unsigned(无符号)的无符号的长度和以上一样,但是因为从0开始并且取值范围的长度不变,所以就为0-有符号的取值上限x2+1.

打印的时候short int为使用%hd,int使用%d,long int使用%ld,long long int使用%lld,如果是无符号的,就是把d改成u。比如:unsigned short int就是用%hu

2字符型

也便是字符,我们电脑中储存的一个字符的空间就是一个字节[1TB=1024GB,1GB=1024MB,1MB=1024KB,1KB=1024B,1Byte(也就是平常说的1B,字节)=8bit(比特位)]

和int类型的不一样的是,int类型前面不加unsigned就默认是加了signed,但是直接写char不一定就是signed char的形式,编译环境不同它可能是signed char也可能为unsigned char。(值得注意的是只有字符型和整型可以分出有无符号的signed和unsigned)

signed char和unsigned char的区别倒是也和整形的相似,就是取值范围不同(但是取值范围的长度相同),字节长度相同都为1B(字节),signed char的取值范围长度是-128-127,unsigned char的取值范围是0-255.那么既然是字符肯定不止是数字,abcd等字母什么的也都可以这个取值范围的数字是象征的什么呢?就是ASCII码值。

ASCII值:我们可以用一个程序来算字符的ASCII码值

#define _CRT_SECURE_NO_WARNINGS //VS2022的可能需要加,其他的应该不需要
#include <stdio.h>
int main()
{
	char qwf = 'a';
	while (scanf("%c", &qwf ) != EOF)
	{
		printf("请输入你想要查找ASCII码值的字符");
        scanf("%c", &qwf);
		printf("%c的ASCII码值为%d\n", qwf, qwf);
	}
	return 0;
}

第一行的VS2022的可能要加,其他可能不需要。

但是这个程序只能查看可视字符的,我们也可以通过如下程序来输入数字查看它的效果,但是因为不可视的都是换行啊,制表啊什么的,所以效果也不是很明显

#define _CRT_SECURE_NO_WARNINGS 1//vs2022的可能要加,其他可能不要
#include <stdio.h>
int main()
{
	char qwf = 'a';
	while (scanf("%c", &qwf ) != EOF)
	{
		printf("请输入你想要查找效果的ASCII码值");
		scanf("%d", &qwf);
		printf("ASCII码值为%d的效果是%c\n", qwf, qwf);
	}
	return 0;
}

其实我们也可以通过上网查询ASCII码值,如ASCII 码表 - cppreference.com

字符输出时:char用%c,unsigned char用%

当然,你也可以用%d输出char或者%u输出unsigned char这样就会输出他们的ASCII码值(如免得程序引用)

3字符串型

字符串简单来说就是好多个字符“串”在一起,组成一个组合,

字符串型的定义用的符号和字符类型的很类似,字符串使用char 数组名字[]="内容",

值得一说的是如果我们直接在数组里一个个输入字符记为s1,直接输入字符串记为s2,s1的会有乱码,计算长度时也会有比一个个输入的字节数多,s2则不会,如以下程序

#include<stdio.h>
#include<string.h>//要加入头文件string.h后才能使用strlen函数
int main()
{
    char s1[] = { 'q','w','f' };
    char s2[] = {"qwf"};
    printf("s1为%s\n长度为%zd\n", s1, strlen(s1));//strlen算出来的类型不是int型,最好用%zd
    printf("s2为%s\n长度为%zd\n", s2, strlen(s2));
    return 0;
}

要加入头文件string.h后才能使用strlen函数,strlen算出来的类型不是int型,最好用%zd

这是因为字符串末尾自带\0,一个个输入字符不会,\0是结束的意思,我们输出字符串的时候是从第一个字符到\0前一个字符的,strlen计算长度时候也是按照这种方式计算的,所以s1因为没有\0读取一直没停止会随机一直往后读取内存到下一个\0的位置,就会出现乱码,strlen计算长度也同理。

输出字符串的时候使用%s

4浮点型

浮点型就是小数形式,因为小数形式的小数点通过把10的几次方提出来小数点是可以移动的,比如3.2可以写成32.0*10的-1次方,也可以写成3200*10的-3次方,所以叫做浮点型(值得注意的是比如3200就可以写成32e2,因为在c语言中e或E后面加数字可以表示为10的n次方)

浮点型分为float(单精度浮点型),double(双精度浮点型),long double(长双精度浮点型)

float是单精度,double时双精度,顾名思义单精度的flaot没双精度的double高,他的有效数字是6-7位,而double是15-16位,long double就更进一步,是18-19位(注意c语言中的位数是从第一个非0数字后开始的,可以看作把全部写成科学计数法后的去掉10的n次方后看位数)

在容纳更大精度的同时他们范围和内存大小自然也更大了,但是不必记,因为都很大,足够平常的使用,哪怕最小的float也有-2的128次方到2的128次方。他们所占的内存的话其实根据编译器不一样,但是按照c语言规定最低float为6,double为10(多数为15到17),long double是10(且大于等于double的长度)

值得注意的是直接输入一个小数比如3.2,系统会默认是double型,想要变成float型就要写成3.2f

输出时float用%f,double用%f或者%lf,long double用%lf,值得一提的是他们输出的时候默认输出小数点后6位数,后面细将输出输入的时候会讲到如何控制输出小数点后几位数

5布尔型

布尔函数的返回值专门成为了布尔型,布尔函数是判断对错的函数,在早期的c语言中False为0,False为非0的数,布尔函数中返回值False为0,Ture为1。布尔函数有两种写法一种是bool,另一种是_Bool,值得注意的是使用bool函数要先引入stdbool.h。

布尔型的取值范围为0和1,所以内存也仅仅占用1个字节。

输出布尔型的时候用%d(和int同)。如如下程序

#include<stdio.h>
#include<stdbool.h>//要加入头文件stdbool.h后才能使用bool函数
int main()
{
	bool a = (1 ==2);//定义bool函数a判断(内的判别式),正确输出1,错误输出0
	printf("%d", a);
	a = (1 == 1);
	printf(" % d", a);

	return 0;
}

6强制转换

当我们输入的一个数为一种类型,但是我们想让他输出为另一种类型的时候可以用强制转换,他的写法一般是:(类型)被转换的目标,如以下程序,就可以把double型的6.66强制转换成int形的6,但是这种时候容易出bug所以不建议常用。

#include<stdio.h>
int main()
{
    int qwf=6.66;
    printf("%d",(int)qwf);
    return 0;

}

7易错

新手前期易错的点主要是:1输出输入时类型没对应,比如字符串本来应该用%s,却用成%c了,虽然没报错,但是结果是错误的,这种有的时候很难检查出来。2输入的数值不在它的取值范围内,比如明明使用了unsigned int,却输入了-1,这种容易报错。

总结

类型大类字节长度输出时使用范围
signed short整形2%hd-2^7-2^7-1
unsigned short整形2%hu0-2^8-1
signed int整形4%d-2^31-2^31-1
unsigned int整形4%u0-2^32-1
signed long整形4%ld-2^31-2^31-1
unsigned long整形4%lu0-2^32-1
signed long long整形8%lld-2^64-2^64-1
unsigned long long整形8%llu0-2^65-1
char字符型1%c或者%d打印ASSII可能和signed char同也可能和unsigned char同
 signed char字符型1%c或者%d打印ASSII-128-127
unsigned char字符型1%c或者%u打印ASSII0-255
float浮点型>=6%f

-2^128-2^128

精度6到7位

double浮点型>=10%f或%lf

很大

精度15到16位

long double浮点型>=10且>=double的%lf

超级大

精度18到19位

bool或者_Bool布尔型1%d0或1

 

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值