当前位置:网站首页>c语言-数据存储部分
c语言-数据存储部分
2022-08-11 05:30:00 【CHAKMING1】
目录
一、数据类型介绍
c语言中提供了许多常见的数据类型,每种数据类型所占字节大小是有规定的,大小决定了他们的适用范围,而且在不同的环境底下,所占的字节大小有些许差异。
char c; // 字符类型
short i; // 短整型
int i; // 整型
long i; // 长整型
long long i; // 更长的整型
float f; // 单精度浮点型
double f; // 双精度浮点型
char *pc; // 指针类型
struct stu {}; // 结构体类型
enum Week{sun}; // 枚举类型
union Data {}; // 共用体类型
C声明 | 字节数 | ||
有符号 | 无符号 | 32位 | 64位 |
char | unsigned char | 1 | 1 |
short | unsigned short | 2 | 2 |
int | unsigned int | 4 | 4 |
long | unsigned long | 4 | 8 |
int32_t | int32_t | 4 | 4 |
int64_t | int64_t | 8 | 8 |
float | 4 | 4 | |
double | 8 | 8 |
二、不同进制的表示方法以及相互之间的转换
在计算机程序设计里面,我们会经常见到几种进制,最为熟悉,也是最适合我们人类的进制就是十进制,除此之外,还有二进制、八进制以及十六进制。
1.二进制、十进制、十六进制之间的转换
在C语言中,以0x或者0X开头的数字常量被认为是十六进制的值。十六进制也就是值不能超过十六的进制,10-15的数字就用字符'A'到'F'来表示。字符可以是大写也可以是小写,也可以是大小写混合。参考一下表格:
十六进制数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
十进制值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制值 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
十六进制数字 | 8 | 9 | A | B | C | D | E | F |
十进制值 | 8 | 8 | 10 | 11 | 12 | 13 | 14 | 15 |
二进制值 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
比如:假设给你一个数字0x123AC4 。可以通过展开每个十六进制数字,将它转为二进制格式:如下所示:
十六进制 | 1 | 2 | 3 | A | C | 4 |
二进制 | 0001 | 0010 | 0011 | 1010 | 1100 | 0100 |
这样就得到二进制0001 0010 0011 1010 1100 0100
同理,反过来,也可以给定一个二进制数字1111001010110110110011,首先是分成4个为一组来转为十六进制。不过要注意位数总数不是4的倍数时,最左边的用0补上。如图所示:
二进制 | 0011 | 1100 | 1010 | 1101 | 1011 | 0011 |
十六进制 | 3 | C | A | D | B | 3 |
那么,十进制和十六进制表示之间的转换需要使用乘法或者除法来进行处理。将一个十进制33转为十六进制,转换方法如下:
33 / 16 == 2 ...... 1
2 / 16 == 0 ...... 2
那么这时候余数自底向上看,得到的结果就为21,那么33的十六进制就是21。
同理,相反来看,一个十六进制A3转为十进制,就需要用乘法实现:
A * 16^1 = 160
3 * 16^0 = 3
160 + 3 = 163
从低位开始乘d(d表示几进制)的i次方(起始是0,每增加一位,增加1),最后将结果相加,就得到十六进制A3的十进制为163。
2. 二进制与八进制之间的转换
在C语言里面,以0开头的数字常量被认为是八进制的值。八进制也就是值不能超过8的进制。
八进制数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
十进制值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
二进制值 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
假设给你一个035的八进制数,和十六进制的展开方法一样,结果为011101
假设给你一个100110的二进制,转为八进制,结果为045
三、整型在内存中的存储:原码、反码、补码
计算机的整数有三种表示方法:原码、反码和补码。
三种方法表示均有符号位和数值位两部分,符号位用0表示“正”,符号位用1表示“负”,只有在有符号类型的数据里面才是用这种表示方法。。
首先,正数的原码、反码、补码都是相同的,就是一个正数的二进制表示形式。
其次,负数的三种表示方法各有不同。
- 原码:正数的二进制表示,最高位为1。
- 反码:原码的符号位不变,其他位取反
- 补码:反码+1得到补码
那么,对于整形来说,数据存放在内存中的都是补码。
有符号数转为补码其他表示方法:
我们用二进制1101转为十进制的补码形式,可以将最高位的1当成-1.
1101 --> -2^3 + 2^2 + 2^0 = -3 --> 1011
而1011就是二进制1101的补码。
四、大小端字节序介绍及判断
对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。那么就有两种表示字节排列顺序的规则:大端存储和小端存储。
那么,假设变量x的类型为int,占用4个字节,位于地址0x100处,存储了一个十六进制为0x01232134.
大端法:
地址 | 0x100 | 0x101 | 0x102 | 0x103 | ... |
值 | 01 | 23 | 21 | 34 | ... |
小端法:
地址 | 0x100 | 0x101 | 0x102 | 0x103 | ... |
值 | 34 | 21 | 23 | 01 | ... |
总结:
- 大端(存储)模式:是指数据的地位保存在内存的高地址中,而数据的高位,保存在低地址中。
- 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
那么,我们如何测试自己当前机器是否用哪种存储模式呢? 代码如下:
#include <stdio.h>
int check_sys()
{
int i = 1;
// 1 的二进制为 0000 0000 0000 0000 0000 0000 0000 0001
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if(ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
边栏推荐
- 2021年vscode终端设置为bash模式
- 微信小程序云开发项目wx-store代码详解
- OpenMLDB + Jupyter Notebook: Quickly Build Machine Learning Applications
- Vscode remote connection server terminal zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
- 欧拉法解微分方程
- USB URB
- 连接数据库时出现WARN: Establishing SSL connection without server‘s identity verification is not recommended.
- mk file introduction
- Pinyougou project combat notes
- OpenMLDB Pulsar Connector:高效打通实时数据到特征工程
猜你喜欢
Invalid revision: 3.18.1-g262b901-dirty
USB URB
开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~
无效的修订:3.18.1-g262b901-dirty
[Meetup] OpenMLDBxDolphinScheduler engineering and scheduling link link characteristics, building the end-to-end MLOps workflow
JVM tuning and finishing
Fourth Paradigm OpenMLDB optimization innovation paper was accepted by VLDB, the top international database association
Day 85
Day 75
js学习进阶BOM部分(pink老师笔记)
随机推荐
Node 踩坑之80端口被占用
Tinker的自我介绍
Building a data ecology for feature engineering - Embrace the open source ecology, OpenMLDB fully opens up the MLOps ecological tool chain
Day 70
Js method commonly used objects and attributes
JS advanced web page special effects (pink teacher notes)
PAT乙级刷题之路
手把手导入企业项目(快速完成本地项目配置)
heap2 (tcache attack,house of orange)
微信小程序云开发项目wx-store代码详解
[Meetup]OpenMLDBxDolphinScheduler 链接特征工程与调度环节,打造端到端MLOps工作流
星盟-pwn-babyheap
论文解读:GAN与检测网络多任务/SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network
js learning advanced (event senior pink teacher teaching notes)
Minutes of OpenMLDB Meetup No.2
Wonderful linkage | OpenMLDB Pulsar Connector principle and practical operation
Day 76
Day 85
Regular expression replacement for batch quick modification code
无效的修订:3.18.1-g262b901-dirty