数据类型-

本文详细介绍了C/C++中的数据类型,包括常量、变量的定义与使用,以及基本类型如整型、字符型、浮点型的特性。讲解了不同进制之间的转换,并探讨了计算机内存中数值的存储方式,如原码、反码和补码。同时,文章还讨论了有符号数和无符号数的概念以及数据溢出问题。此外,还涉及了类型限定符、字符串格式化输出与输入的相关函数如printf和scanf。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常量与变量

C的关键字共有32个
在这里插入图片描述

常量

在程序运行过程中其值不能发生改变的量,称为常量。
定义常量:

  1. 使用const 数据类型 常量名=值 (不安全)
const float pi = 3.14159;
  1. 使用宏定义常量:#define 常量名 值
#define PI 3.14159  //无等号,无分号

变量

在程序运行过程中其值可以改变的量,称为变量。
定义格式
数据类型 变量=值
在定义局部变量时,可以在数据类型前加auto(一般不加)

int weight = 5;

标识符命名规则:

  • 标识符不能是关键字
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写
  • 要见名知意 如:RoleLv role_lv(驼峰式命名)

使用示例

例一:

#include<stdio.h>

int main(void)
{
	//黄瓜3元/斤,购买5斤
	//常量:在程序运行过程中其值不能发生改变的量,称为常量。
	const int price = 3;//使用const定义常量
	//变量:在程序运行过程中其值可以改变的量,称为变量。
	int weight = 5;
	int sum = price * weight;
	printf("%d\n", sum);
	return 0;
}

结果:

15

例二:

#include<stdio.h>
//宏定义常量
#define PI 3.14159

int main()
{
	//圆的面积:s=pi*r*r
	//圆的周长:c=2*pi*r
	//常量 pi
	//const float pi = 3.14159;
	float r = 3.2;
	float s = PI * r*r;
	float c =2* PI * r;
	//占位符 %f表示输出一个浮点型float 默认保留6位小数
	printf("圆的面积:%f\n", s);
	printf("圆的周长:%.2f\n", c);//.2表示保留2位小数,会四舍五入
	return 0;

}

结果:

圆的面积:32.169884
圆的周长:20.11

基本类型

数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
在这里插入图片描述

整型:int

整型变量的定义和输出
在这里插入图片描述
整型变量的输入
 在使用键盘进行输入时需要使用scanf,但由于用户输入的问题会引起安全警告。
scanf安全问题解决:

#define _CRT_SECURE_NO_WARNINGS//需放在整个程序的首位

或者

#pragma warning(disable:4996)//放在程序的任意位置

示例:

//#define _CRT_SECURE_NO_WARNINGS//消除由于scanf引起的警告 
#include<stdio.h>
#pragma warning(disable:4996) //或者使用此预处理命令约束警告 ,可以放在程序的任何位置
int main(void)
{
	int a;

	scanf("%d", &a);//通过键盘输入赋值,&运算符表示取地址运算符,其后不加"\n"

	printf("%d\n", a);

	return 0;
}

结果

123
123

整型的大小和范围

sizeof关键字

  • sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
  • sizeof的返回值为size_t
  • size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
    在这里插入图片描述
    在这里插入图片描述
    示例:
#include<stdio.h>

int main(void)
{
	int a = 10;//整型变量
	short b = 20;//短整型
	long c = 30;//长整型
	long long d = 40;//长长整型

	//short<=int<=long<long long

	printf("%d\n", a);
	printf("%hd\n", b);//占位符表示输出一个短整型数据 
	printf("%ld\n", c);//占位符表示输出一个长整型
	printf("%lld\n", d);//占位符表示输出一个长长整型

	//sizeof 计算数据类型在内存中占的字节(BYTE)大小
	1B=8bit

	/*sizeof(数据类型)=sizeof(变量名)*/
	unsigned int len = sizeof(int);

	/*printf("%u\n", len);*/
	printf("整型:%d\n", sizeof(a));//4=32bit
	printf("短整型:%d\n", sizeof(b));//2
	printf("长整型:%d\n", sizeof(c));//4
	printf("长长整型:%d\n", sizeof(d));//8

	return 0;
}

结果:

10
20
30
40
整型:4
短整型:2
长整型:4
长长整型:8

字符型 char

字符变量的定义和输出
 字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。
示例:

#include<stdio.h>

int main(void)
{
	//字符类型变量
	char ch = 'a';
	//打印字符变量
	printf("%c\n", ch);

	//打印字母a对应的十进制数
	printf("%d\n", ch);

	//打印字符型的大小
	printf("字符型大小:%d\n", sizeof(ch));

	return 0;
}

结果:

a
97
字符型大小:1

 字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
示例:

#include<stdio.h>
int main(void)
{
	char ch1 = 'a';
	char ch2 = 'A';
	printf("%d\n", ch1 - ch2);//输出的为其ASCII码相减后的结果

	return 0;

结果:

32

字符型的输入
使用scanf输入

scanf("%c", &ch);

示例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	char ch;
	printf("请输入字符:%c\n");
	scanf("%c", &ch);
	printf("%c\n", ch-32);
	return 0;
}

结果:

请输入字符:\
a
A

转义字符
在这里插入图片描述

浮点型

 浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
 由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
 不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
示例

#include<stdio.h>

int main(void)
{
	float a = 3.14f;
	double b = 3.14;
	printf("%.2f\n", a);
	printf("%f\n", b);

	//sizeof字节大小
	//浮点型数据,存储在内存中的格式分为符号位、指数位、小数位
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));

	return 0;
}

结果:

3.14
3.140000
4
8

科学计数法表示

int main(void)
{
	/*float a = 3210.456;
	printf("%e\n", a);*/

	float b = 3.2e3f;
	printf("%f\n", b);
	return 0;
}

结果:

3200.000000

进制

二进制与十进制转换

十进制转换成二进制:除2反序取余法—用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
在这里插入图片描述
或者使用 8421法则:将十进制数使用2的n次幂数进行组合。
8—1000
4—100
2—10
1—1
在这里插入图片描述

十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
在这里插入图片描述

二进制转换成十进制: 权值法—将一个二进制数依次从末尾开始乘以2的n次幂然后相加,n从0开始。
在这里插入图片描述
或者使用 8421法则:那个位为1则加上其对应的十进制数
在这里插入图片描述

八进制与十进制转换

十进制转换成八进制:用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
在这里插入图片描述
八进制转换成十进制:权值法
在这里插入图片描述

十六进制与十进制转换

十进制转换成十六进制:用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
在这里插入图片描述
十六进制转换成十进制:权值法
在这里插入图片描述

二进制与八进制转换

二进制转换成八进制
八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
在这里插入图片描述
八进制转换成二进制
在这里插入图片描述

二进制与十六进制的转换

二进制转换成十六进制
十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。
在这里插入图片描述
十六进制转换成二进制
在这里插入图片描述

八进制与十六进制的转换

先将八进制转换成二进制,然后再将二进制转换成十六进制

C语言如何表示相应进制数

在这里插入图片描述

计算机内存数值存储方式

原码

一个数的原码(原始的二进制码)有如下特点:

  • 最高位做为符号位,0表示正,为1表示负
  • 其它数值部分就是数值本身绝对值的二进制数
  • 负数的原码是在其绝对值的基础上,最高位变为1
    下面数值以1字节的大小描述:
    在这里插入图片描述

反码

  • 对于正数,反码与原码相同
  • 对于负数,符号位不变,其它部分取反(1变0,0变1)
    在这里插入图片描述

补码

在计算机系统中,数值一律用补码来存储。 主要原因是:

  • 统一了零的编码
  • 将符号位和其它位统一处理
  • 将减法运算转变为加法运算
  • 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

补码特点:

  1. 对于正数,原码、反码、补码相同
  2. 对于负数,其补码为它的反码加1
  3. 补码符号位不动,其他位求反,最后整个数加1,得到原码

有符号数和无符号数

有符号数:有符号数是最高位为符号位,0代表正数,1代表负数。
无符号数:无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
有符号数和无符号数取值范围
在这里插入图片描述
在这里插入图片描述

数据溢出

  • 当超过一个数据类型能够存放最大的范围时,数值会溢出。
  • 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
  • 有符号位数据溢出,比如:127+1会变成 -128,-128+1会变成 -127

类型限定符

在这里插入图片描述

字符串格式化输出与输入

  • 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
  • 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。

字符串常量与字符常量的不同:
在这里插入图片描述
示例

#include<stdio.h>

int main(void)
{
	//char a = 'a';
	char *b = "hello world";
	printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
	return 0;
}

结果:

hello world

比较

#include<stdio.h>

int main(void)
{
	//char a = 'a';
	char *b = "hello\0 world";
	printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
	return 0;
}

结果:

hello
#include<stdio.h>

int main(void)
{
	//char a = 'a';
	char b[11] = "hello world";//因为\0的存在b一共有12位
	printf("%s\n", b);//占位符,表示输出一个字符串,遇到\0停止
	return 0;
}

结果:因为\0的存在b一共有12位,所以在有11位时就找不到\0,所以出现乱码。

hello world烫烫虀涷80

printf函数和putchar函数

printf函数
printf是输出一个字符串。

  • printf格式字符:
    在这里插入图片描述
  • printf附加格式:
    在这里插入图片描述

示例

#include<stdio.h>int main(void)
{
	float b = 3.14;
	printf("===%7.2f===", b);//7表示总体的宽度
	return 0;

结果:

===   3.14===

putchar函数
putchar输出一个char。
示例

#include<stdio.h>
int main(void)
{
	char ch = 'a';

//输出字符可以是变量、字符、数字、转义字符
	putchar(ch);
	putchar('\n');
	putchar('B');
	putchar('\n');
	putchar(97);
	return 0;
}

结果:

a
B
a

scanf函数与getchar函数

scanf函数
scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
示例

#define _CRT_SECURE_NO_WARNINGS//使用scanf时需要的安全声明
#include<stdio.h>
int main(void)
{
	int a, b;
	scanf("%d,%d", &a, &b);//%d输入中间不能加\n,因为scanf 是以\n结尾的会被吸收掉
	printf("%d\t%d", a, b);//\t表示制表符,打印空格
	return 0;

}

结果

12,34
12      34

getchar 函数
getchar是从标准输入设备读取一个char。
示例

int main(void)
{
	char ch;
	ch = getchar();//接收键盘获取字符
	putchar(ch);

	getchar();//用于暂时停留界面

	return 0;
}

结果

h
h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值