C语言数据类型
目录
常量
什么是常量: 日常使用的一些固定值,这些值是不改变
整形常量
普通整形常量:1,2,3,4...
无符号整形常量: 1u 没有负数
长整形常量: 1L
短整型常量:没有特殊表达方式
字符常量
字符边界符 '' 字符A:'A' 只有一个字符
转义字符:由斜杠+特殊字符组成,打印会有一些特殊效果(格式类,或者效果类)
转义字符 含义 \n 换行键 \r 回车键(回到本行第一个位置) \t tab键 \a 响铃 \ddd 三位八进制数 \xhh 十六进制
实数形(小数或者整数)常量
单精度实数形常量: 1.11f
双精度实数形常量
随便写一个小数,它默认是双精度类型
科学计数法
3.14E-3(3.14*10^-3)
字符串常量:多个字符组成,有特定字符(斜杠0)作为结束标记
字符串边界符" " : 字符串A: "A"
注意"A" 和‘A’ 是有区别的,对于"A" 来说里面有两个字符,一个‘A’ 后面还有一个看不到'\0'
每一个字符串后面必定存在一个字 符串结束标记
变量
什么是变量: 就是可以改变的量,通常情况可以把变量理解一个容器(装东西的物件:水果篮子)
如何产生一个变量
变量定义语法: 类型 变量名
int iNum; int iNum=0; //初始化
C语言基本数据类型
整形: int int iNum
单精度浮点形: float float fNum
双精度浮点形: double double dNum
字符类型: char char cNum
一些修饰类型的关键
unsigned 和signed: 无符号, 一般不做说明,都是有符号(signed)
unsigned int: 无符号整形
unsigned char; 无符号字符形
注意点: 不能修饰浮点形 不存在 :unsigned float
short和long: 短和长,体现在内存上
short int:
long int:
long long int:
注意点: 用来修饰整形的
特殊修饰词
const修饰
创建时必需初始化(vs2022做了优化可以不初始化)
值不能修改
static修饰
初始化代码只执行一次
保存程序上一次运行结果
extern:修饰外部变量
存储关系
二进制与存储关系
1B=8b
数据类型所占内存问题
进制转换(万能:程序员计算器)
十进制转其他进制:短除法
其他进制转十进制:加权法
原码反码补码移码
编码规则
有符号数的编码规则
原码:最高位为符号位
反码:
正数:反码与补码相同
负数:符号位不变,其余位对原码取反
补码:
正数:补码与原码相同
负数:对反码加一
移码:
对补码符号位取反
3+5 11+101=1000
数据的真实存储
大小端
高地址与低地址
高字节与低字节
网络数据:大端模式的数据
应用场景
面试题:写程序判断存储方式
作业
1、把二进制 101000000111011011000转换为 十进制 八进制 十六进制的数,要有过程。
二进制 :1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 0(21)
十进制 :2^20 +2^18+2^11+2^10+2^9+2^7+2^6+2^4+2^3
八进制(三位二进制): 5 0 0 7 3 3 0 (500733)
十六进制(八位) : 1 4 0 E D 8(140ED8)
2、尝试写出 9-13=-4 的二进制计算过程。
0000 1001 (9原码)
1000 1101 --->(-13原码)
1111 0010 --->(-13反码)
1111 0011 --->(-13补码)
0000 1001 (9补码)
1111 0011 (-13补码)
相加
1111 1100 --->(结果补码)
1111 1011 --->(结果反码)
1000 0100 --->(结果原码)
得结果为 -4
进制转换小程序
#include<stdio.h> #include<stdlib.h> #define N 64 //64位 int arr[N] = { 0 }; //用数组装二进制,八进制 int temp = 0; //记录二进制串大小 char Arr[N] = { 48 }; //字符数组装十六进制,根据ASCII码表操作 //十进制转二进制 int ten_Two(int iNum) { if (iNum < 0) { iNum = -iNum; while (1) { arr[temp] = iNum % 2; iNum /= 2; if (iNum == 0) break; temp++; } printf("二进制:"); printf("1"); for (int i = temp; i >= 0; i--) { printf("%d", arr[i]); } printf("\n"); } else { while (1) { arr[temp] = iNum % 2; iNum /= 2; if (iNum == 0) break; temp++; } printf("二进制:"); for (int i = temp; i >= 0; i--) { printf("%d", arr[i]); } printf("\n"); } } //十进制转八进制 int ten_Eight(int iNum) { while (1) { arr[temp] = iNum % 8; iNum /= 8; if (iNum == 0) break; temp++; } printf("八进制:"); for (int i = temp; i >=0; i--) { printf("%d", arr[i]); } printf("\n"); } //十进制转十六进制 int ten_Sixteen(int iNum) { while (1) { Arr[temp] = iNum % 16 + 48; //ASCII码表中48-57表示0-9 iNum /= 16; if (iNum == 0) break; temp++; } for (int i = 0; i <= temp; i++) { if (Arr[i] == 58) //10-15由A-F表示 Arr[i] = 'A'; if (Arr[i] == 59) Arr[i] = 'B'; if (Arr[i] == 60) Arr[i] = 'C'; if (Arr[i] == 61) Arr[i] = 'D'; if (Arr[i] == 62) Arr[i] = 'E'; if (Arr[i] == 63) Arr[i] = 'F'; } printf("十六进制:"); printf("0x"); //十六进制标准 for (int i = temp; i >= 0; i--) { printf("%c", Arr[i]); } printf("\n"); } //菜单 void Menu() { printf("**************************\n"); printf("****1.十进制转二进制******\n"); printf("****2.十进制转八进制******\n"); printf("****3.十进制转十六进制****\n"); printf("**************************\n"); } //按键控制 void Key() { int useKey = 0; int iNum = 0; scanf_s("%d", &useKey); switch (useKey) { case 1: printf("请输入十进制数:\n"); scanf_s("%d", &iNum); ten_Two(iNum); break; case 2: printf("请输入十进制正数:\n"); scanf_s("%d", &iNum); ten_Eight(iNum); break; case 3: printf("请输入十进制正数:\n"); scanf_s("%d", &iNum); ten_Sixteen(iNum); break; default: printf("输入错误,请重新输入!!!\n"); return Key(); } } int main() { Menu(); Key(); system("pause"); system("cls"); return 0; }