c语言二 数据类型, %, 原反补码
1.关键字
c语言共有32个关键字
-
数据类型关键字(12个)
char,short,int,long,float,double
unsigned,signed,struct,union,enum,void
-
控制语句关键字(12个)
if,else,switch,case,default
for,do,while,break,continue,goto,return
-
存储类型关键字(5个)
auto,extren,register,static,const
-
其他关键字(3个)
sizeof,typedef,volatile
2.数据类型
作用:编译器预算对象(变量)分配的内存空间大小
共3类型 1.基本类型:整形(int,short,long) 字符型(char) 实型/浮点型(float,double)
2.构造类型:数组类型, 结构类型(struct). 联合类型(union).枚举类型(enum)
3.指针类型:(char* int* int**等)
3.常量
定义: 1.在程序运行过程中,其值不能改变的量
2.常量一般出现在表达式或赋值语句中
- 整形常量:100,-451,15,0
- 实型常量:3.14,0.12,-3.55
- 字符型常量:'a','b','c'
- 字符串常量:"一段话"
4.变量
定义: 1.在程序运行过程中,其值可以被改变
2.变量在使用前必须被定义,定义变量必须要有相应的数据类型
- 标识符命名规则:
- 不能是关键字
- 只能由字母,数字,下划线组成
- 第一个字符必须是字母或下划线,决不能是数字
- 字母区分大小写
特点:
1.变量在编译时为其分配相应的内存空间
2.可以通过名字和地址访问相应内存
声明和定义的区别:
1.声明变量不需要建立存储空间。 如extern int a;
2.定义变量需要建立存储空间。如:int b;
#include <stdio.h>
int main(){
//extern 关键字只做声明,不能做定义,后面会深入学,目前只是初步了解
//声明一个变量a,a在这里没有建立存储空间
extern int a;
a=10; //没有空间是不能赋值的, 这里点击运行则会发生错误
int b=10; //定义一个变量b,b的类型为int,b赋值为10
getchar();
return 0;
}
从广义的角度来件,声明>=定义,定义是声明里的一个特例,
- int b 既是声明也是定义
- extern int b 只是声明不是定义
一般情况下,把建立存储空间的声明称之为"定义",而把不需要建立存储空间是声明称之为"声明"
#include <stdio.h>
#define MAX 100
/*
1.#开头的语句是预处理语句,无需分号结束
2.定义一个宏定义标识符MAX,它代表100,MAX它是常量
3.宏定义以后的代码都可以使用MAX
4.在后面出现的MAX,预处理都会替换为100
*/
int main (){
MAX;
//const 关键字,作用是修饰一个变量就读
const int b =10086;
printf("const int b =(直白数字1028) 即 ",b);
const int d= MAX;
printf("const int d = (宏定义常量MAX)",d);
getchar();
return 0;
}
5.进制
二进制:逢二进一 bin
八进制:逢八进一 oct
十进制:逢十进一 dec
十六进制:逢十六进一 hex
一个位只能表示0或1俩种状态,简称bit,一个位是一个bit
一个字节8个二进制,称8位,简称BYTE,8个bit是一个字节
一个汉字为2个字节,简称为WORD
俩个字节为双字,简称为DWORD
//进制的输出方式
#include <stdio.h>
int main (){
int a=10;
int b=010;
int c=0x10;
/*
数字前面什么都不写默认表示十进制数据
数字前面加个0零表示八进制数据
数字前面加个0x表示为十六进制数据,且字母为小写
还有0X也为十六进制,且字母为大写
*/
printf("用十进制方式去输出十进制a ""%d\n",a);
/*
printf("文字""指令",a);注意""""相隔中没有符号,且文字里不能出现%d这种东西
比如printf("文%d字""%d\n",a) 运行时第一个%d变成a,而后面的%d就会出问题
用十进制输出'参数'==十进制的a 10
而\n即是在输出'参数'之后做换行的动作
printf(a) 这是错误操作,因为输出参数a,电脑需要知道你要输出什么进制的数字
*/
printf("用八进制方式去输出十进制a ""%o\n",a); //注意这是是小写o 不是0零
printf("用十六(小x)进制方式去输出十进制a ""%x\n",a);
printf("用十六(大X)进制方式去输出十进制a ""%X\n",a);
getchar(); //记得养成好习惯
return 0;
}
6.计算机的内存数值存储方式
原码
将最高位作为符号位(0为正,1为负),其余各位代表数值本身绝对值
+7的原码是00000111
-7的原码是10000111
反码
-
正数的原码反码补码
-
负数,则其符号位不变仍为1,其他各位与原码相反
+7的反码为00000111
-7的反码为11111000
补码
适用于计算机的运算
正数的原码反码补码
负数的补码=反码+1
7-6=1
7的补码和-6的补码相加:00000111+11111010=100000001
进位舍弃后,剩下的00000001就是1的补码.
7: -6:
00000111(原码) 10000110(原码)
00000111(反码) 11111001(反码)
00000111(补码) 11111010(补码)
00000111(7的补码)
11111010(-6的补码)
100000001(1)
-7+6=-1
-7的补码和6的补码相加:11111001+00000110=11111111 然后再反码加一 即为-1
-7: 6:
1000 0111(原码) 0000 0110(原码)
1111 1000(反码) 0000 0110(反码)
1111 1001(补码) 0000 0110(补码)
但相加后得到的数仍无法获取结果 可以再反码+1
-
sizeof
关键字,功能是 求指定数据类型在内存中的大小,单位为字节
#include <stdio.h>
int main (){
printf("使用sizeof查阅十进制的int等于多少? %d\n",sizeof(int));
/*
int a=10;
printf("%d",sizeof(a));
这个用法和c++一样 是正确用法
*/
getchar();
return 0;
}
-
int
常量,变量. 32位的一个二进制整数,在内存中占据4个字节
-
空间printf输出int值
%d 输出一个有符号的10进制整数
%u 代表输出一个无符号的10进制整数
%x 代表输出小写字母的16进制整数
%X 代表输出大写字母的16进制整数
-
short, long , long long, unsigned int
short为短整形,在32位系统下是2个字节,16bite
long为长整形,在32位系统下是4字节.
int 在64位系统下,window系统还是4字节,而unix系统则为8字节
7.char类型
1.char 常量,变量
char a; 定义一个char变量
'b' , char的常量
char是本质是一个整数,一个只有1个字节大小的整数
2.printf输出char
%c表示输出一个字符,而不是一个整数
3.不可打印char转义符
\a 警报
\b 退格
\n 换行
\r 回车
\t 制表符
\\ 单斜杠
\' 单引号
\" 单双引号
\? 问号
4.char和unsigned char
char的取值范围为 -128 到 127
unsigned char 为 0 到 255
8.浮点型 float, double
1.浮点常量,变量
float在32位系统下是4字节
double在32位系统下是8字节
小数效率低下,避免实验,除法需要明确计算一个小数
2.printf输出浮点数
%f 输出一个float
%lf 输出一个double
float a=3.14;
printf("%f",a);
/*
1.这里因为定义的是float,所以%后面接f或lf(皆为浮点型),不接d(不然会运行出来的数字是错的)
因为a是浮点型,怎么可能输出%d整数型呢
正确操作为
float a=3.14;
printf("%d",(int)a);
将a浮点型转变为整数型
输出显示为3 小数点后面的直接忽略(没有四舍五入)
2.输出a时 为3.140000 一共6位小数(小数点后6位),浮点型皆为6位小数
那只想要3.1或3.14或3.140......怎么办呢?
操作如下:
float a=3.14;
printf("%0.1f",a); 这里输出显示3.1 且会四舍五入
printf("%0.2f",a); 这里输出显示3.14 且会四舍五入
printf("%0.3f",a); 这里输出显示3.140 且会四舍五入
......
那想要其向从左往右第15个格子向右对齐只需要
printf("%15f",a); 即可,且不影响3.1或3.14等的取舍
printf("%15.2",a);
3.类型限定
const
代表一个不能改变值的常量
volatile
代表变量是一个可能被CPU指令之外的地方改变的,编译器就不会针对这个变量去优化目标代码
register
变量在CPU寄存器里面,而不是在内存里面.但register是建议型的指令,而不是命令型的指令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!