当前位置: 首页 > news >正文

一个字节一定是8比特吗?如何查看二进制文件前几个字节?计算机存储单元bit?数据类型大小?

目录

一个字节一定是8比特吗?

如何查看二进制文件前几个字节?

计算机存储单元bit

数据类型大小

sizeof

char类型

short类型

int类型

long类型

long long类型

float类型

double类型

long double类型

char *类型


一个字节一定是8比特吗?

不是的,虽然当今主流计算机系统,大部分都把一个字节定义为8比特,但计算机早期,真的不是这样。正因为如此,C语言存在CHAR_BIT宏,可以定义为非8数值.

  • 早期PDP-10字节是9位。
  • C语言早期并没有定义此标准,随着计算机系统不断统一,C99就引入了stdint.h, 有int8_t, int16_t之类的固定大小类型。

如何查看二进制文件前几个字节?

BOM检查是有的程序员经常干的事情,可以利用hexdump + head命令获取二进制文件的前面的字节。例如检查1.c文件二进制dump后的前面2行:
hexdump 1.c | head -2

0000000 bbef 23bf 6e69 6c63 6475 2065 733c 6474
0000010 6f69 682e 0a3e 6923 636e 756c 6564 3c20

可以看到开头的几个字节:EF BB BF, 是UTF-8 BOM的标志。

注意,Windows默认没有hexdump命令,需借助Cygwin的支持,当然也可以使用git工具里面的xxd命令。当然,有人写了Windows hexdump,可从如下地址下载:HEXDUMP for Windows (di-mgt.com.au)

计算机存储单元bit

大部分计算机最小内存操作单元是字节,JESD DRAM标准DQ位宽也经常按8 bits为单位。英文字母ASCII码虽然可以优化为7位,但7不是一个计算机的好数字,按8位算是最优空间。当然,CPU也有提供位操作指令可以读取或者更新特定的比特。

数据类型大小

编译型语言数据类型大小比较确定,可能有多种,但具体在特定平台特定编译器,大小一定是确定的。解释型语言或脚本处理数据类型更自由,默认看成“字符串”,在做数值运算自动转换。本文不过多讨论脚本类语言,它们不太关心这么多细节。

以如下标准的数据类型为例:

  • char / short / int / long (long) / float / (long) double

sizeof

  • C/ObjC/C++/C# 都提供sizeof运算符计算类型大小,尽管如此,编译型语言类型大小不是完全统一,甚至完全不是预期。
  • C/ObjC/C++ sizeof既是关键字又是运算符,此运算符是编译器计算而非运行期计算。比较有意思的是,虽然是编译期可计算,它不能用于宏条件编译判断。
  • Java没有sizeof运算符,因为它认为所有数据类型大小都是确定的,依然可以用<TYPE>.SIZE得到类型的比特数。
    Integer.SIZE返回32.
  • Python用getsizeof获取变量大小,包括对象的其他内存开销,如下并不是等于4或者8.
    sys.getsizeof(1)
  • 结构体的大小不一定等于所有成员大小之和,对齐影响最终的大小。
  • 空类大小是0吗? C++不为0,为了避免不同对象在同一个地址。

char类型

  • C/ObjC/C++ char类型为1字节,wchar_t一般为2字节。
    • ObjC NSString字符串内部默认是UTF-16编码,一个字符是2字节。
  • Java/C# char类型默认是Unicode字符,2字节。
    C# char类型和ushort类型范围是一样的。
  • Go有两种字符类型,byte是以往的1字节字符,rune代表4字节Unicode字符(相当于int32类型)。
  • Swift用Character代表字符类型,Swift 5之前默认字符是UTF-16或ASCII码存储,即一个字符可能是1字节或2字节,Swift 5之后(包含)默认是UTF-8编码,根据字符所属范围长度不等。

short类型

  • Fortran支持的整形之一,kind = 2代表2字节。
  • C/C++不直接规定它的长度,要求不大于int类型,不小于char类型。具体实现一般为2字节。
  • Java/C#中short固定为2字节。

int类型

  • int类型代表计算机系统处理整形最自然的长度,一般和数据寄存器长度一样。
  • 和short类型,Fortran kind=4即代表常规意义的标准的整形。
  • 和short类似,C/ObjC/C++不直接规定它的长度,要求不大于long类型,不小于short类型。具体实现一般为4字节。
    • 一般而言,16位系统int是2字节,32位系统int为4字节,而64位系统并不一定是8字节,因为有long的存在。
  • Java/C#固定为4字节。
  • Rust isize和usize类型长度取决于目标平台,i32和i64是固定大小。
  • 仓颉Int32固定4字节,Int64固定8字节。

long类型

  • C/C++规定long类型只要不小于int类型即可。
  • Fortran kind=8代表8字节整形,有点类似于64位系统long的长度(一般而言)。
  • 32位编译器,int和long一般都设置为4字节,另外Windows 16位环境下long也是4字节。
  • 64位编译器,Linux平台long一般提升到8字节,int一般保持为4字节;Windows平台long和int保持为4字节,用long long表示8字节。这是由于Win64使用LLP64模型,Linux 64位使用LP64.
    • 关于Windows 64位LLP64模型,可参考: Why did the Win64 team choose the LLP64 model?
  • Java/C#固定为8字节。

long long类型

  • 大部分编译器认为它不小于long类型即可,在64位系统一般为8字节。因为目前没有广泛使用128位系统,long long一般不会超过16字节。

float类型

  • 一般float类型定义为4字节。

double类型

  • 一般double类型定义为8字节。

long double类型

  • 一般long double类型至少不小于double类型,不同编译器环境有差异。
  • 不一定是16字节,可能保持和double类型一样为8字节,也可能是10字节。
  • 32位的gcc比较特殊,long double长度为12字节。gcc也提供编译选项选择long double的长度,例如: -m128bit-long-double或-mlong-double-80等等.
  • 带复数的complex long double类型一般是long double的2倍。

char *类型

  • C/C++对char *类型的处理不能完全按指针,要根据上下文。
    • sizeof("hello")返回5,而不是指针的大小4或者8.
    • 数组变量的sizeof返回数组大小,而非数组的影子指针大小。
      • 总结起来,当编译器能知道它的大小,就按那个大小,不能确定大小,按指针大小。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关文章:

  • 函数指针与指针函数:本质区别与高级应用
  • YOLOv4 改进点详解
  • Spring Boot多数据源切换:三种实现方式详解与实战
  • 二.干货干货!!!SpringAI入门到实战-记忆存储和会话隔离
  • Adobe 发布 Android 版 Photoshop(目前免费测试)
  • 电阻篇---下拉电阻
  • 行列式的逆序数法定义 线性代数
  • 论文笔记 <交通灯> <多智能体>DERLight双重经验回放灯机制
  • Web server failed to start. Port XXX was already in use.
  • Nginx限速配置详解
  • CountDownLatch与CyclicBarrier的区别
  • AOP +ThreadLocal实现对接口监控
  • 共享内存实现进程通信
  • C++ STL常用二分查找算法
  • 第二十六周:序列化和反序列化
  • Jenkins 全面深入学习目录
  • MFE微前端:如何捕捉远程应用的remote.js加载失败的错误?
  • 001微信小程序入门
  • sql中like and not like的优化
  • Web后端基础:数据库
  • 2018年怎么做网站排名/推广网站的文案
  • 高端手机网站设计/怎么创建网站的快捷方式
  • 施工企业承揽业务不良行为/优化大师怎么卸载
  • 我有域名怎么做网站/网站服务公司
  • 都安做网站/视频号下载器手机版
  • 网站建设和运营哪家公司好/老域名购买