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是建议型的指令,而不是命令型的指令

posted @   追梦的那些孩子  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示