很多没有学习过c的开发都会有这个疑惑?难道是单纯的为了装逼吗?
背景
内存需要自己分配
* C 语言很苦逼,必须自己管理内存。
* 自己申请、 申请释放、
* 还要自己规划整个内存布局 明确知道这申请内存地址在内存中的位置
计算机数据单位
* 内存都是最小单位都是 字节 byte
* CPU 最小的单位是word 也就字长 有16位 32位 64位
计算机只认识二进制单位
- 全部需要转为二进制执行
- 数字-> 内存 -> CPU
假设都用十进制表示数字会有什么问题
- 10进制首先需要转为二进制
- 操作内存
- 十进制转为 转为 byte
- 申请内存: 需要分配地址时候需要找到起始位置 ,结束位置
- 然后将10进制转为二进制 一个bit一个bit的数
- 然后在转回来到10进制 就问累不累
- 释放内存:上面操作再做一次
如果全部二进制表示 就没那么多转换的事情了
二进制不利于书写
* 一个64bit的数字 64/2=32 32个占位符号
* 即使4位缩进 32/4 = 8
八进制表示
* 一个64bit的数字 64/3=21.2 22个占位符号
* 即使4位缩进 22/4 = 6
16 进制表示
* 一个64bit的数字 64/4 =16 16个占位符号
* 即使4位缩进 16/4 = 4
32 进制表示
* 一个64bit的数字 64/5 =12.8 13个占位符号
* 即使4位缩进 13/4 = 5
结论
- 不是C语言喜欢 使用16进制表示数字是内存分配的需要
- 16个占位付符号是最近节省位置的一种写法
便于内存管理
- 例如 0xDEADDEAD 0xDEADDEAC
- 肉眼看出来 最后一个16位地址不同
- 对于内存管理意义重大
便于CPU的操作
- cpu 一般是word字长 32位DWORD 也就是32位 64为字长是64位
- 读取16的倍数 一次读取16进制的 2位或者 4位
便于寄存器的操作
- 寄存器最下单位bit 只能按照位读取 16位寄存器 32位寄存器 64位寄存器
- 16位集群一次就装配完毕 32地位就直接读取了 同理64一样