字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析

注:本文为 “字、半字、字节” 相关文章合辑。

略作重排,有互引,未整理去重。
如有内容异常,请看原文。


WORD 是 2 Bytes 还是 4 Bytes?

enzo26 2013-07-13 12:50:37

对于嵌入式底层

  1. 1 word 的大小与 CPU 结构有关

    • 32 位 CPU:1 word = 4 bytes
    • 64 位 CPU:1 word = 8 bytes
  2. Half-Word

    • 在 32 位 CPU 中,半字的长度为 16 位,与 8 位 / 16 位处理器体系结构中字的长度一致。
  3. 字节(Byte)

    • 在 8 位 / 16 位 / 32 位处理器体系结构中,字节的长度均为 8 位。
  4. 实际应用示例

    • 在 ARM920T 数据手册中提到:

      Two 16KB caches are implemented, one for instructions, the other for data, both with an 8-word line size.
      实现了两个 16KB 的缓存,一个用于存储指令,另一个用于存储数据,两者的缓存行大小均为 8 个字。

      • 这里的 8-word 等于 32 bytes,而不是 16 bytes。
    • 由于 ARM920T 的缓存行大小为 32 字节,因此在 U-Boot 代码中会看到以下代码,异常处理是 32 字节对齐,以提高读取代码的效率:
      /*
      * exception handlers
      */
      .align 5
      undefined_instruction:
      get_bad_stack
      bad_save_user_regs
      bl   do_undefined_instruction
      .align   5
      software_interrupt:
      get_bad_stack
      bad_save_user_regs
      bl   do_software_interrupt
      .align   5
      prefetch_abort:
      get_bad_stack
      bad_save_user_regs
      bl   do_prefetch_abort
      .align   5
      data_abort:
      get_bad_stack
      bad_save_user_regs
      bl   do_data_abort
      

对于上层开发

在 Visual C++ 6.0 中

  • BYTEWORDDWORD 本质上都是无符号整型,它们在 WINDEF.H 中被定义如下:
    typedef unsigned char    BYTE;
    typedef unsigned short   WORD;
    typedef unsigned long    DWORD;
    
  • 在 Visual C++ 6.0 中:
    • char 型长度为 1 字节
    • short 型长度为 2 字节
    • intlong 型长度都为 4 字节
  • 因此,BYTEWORDDWORD 定义的变量分别占用 1 字节、2 字节和 4 字节内存。

总结

  • 在计算 WORD 的大小时,需要根据具体环境决定是 2 bytes 还是 4 bytes。

字、半字、字节的定义

guosir_ 于 2017-10-25 20:47:54 发布

定义

  • 字(Word) 的大小是根据处理器的特性决定的。
    • ARM 是 32-bit 处理器,因此它的字是 32-bit 的。
    • MSP430 是 16-bit 处理器,因此它的字是 16-bit 的。
  • 半字(Half-Word) 的长度为字的一半。
    • 在 ARM 体系结构中,半字长度为 16-bit。
    • 在 MSP430 中,半字长度为 8-bit。
  • 字节(Byte):无论在哪个 CPU 上,字节的长度均为 8-bit。

CPU 分类

  • CPU 按照其处理信息的字长可以分为:
    • 八位微处理器
    • 十六位微处理器
    • 三十二位微处理器
    • 六十四位微处理器

寻址能力

  • CPU 的寻址能力以字节为单位。例如:
    • 32 位寻址的 CPU 可以寻址 (2^{32}) 个地址,即 4 GB。
    • 这也是为什么 32 位的 CPU 最大能搭配 4 GB 内存的原因,再多的话 CPU 就无法寻址了。

关于 int 类型的大小

  • int 类型所占的字节数依赖于机器的字长:
    • 16 位机上,int 长度是 2 字节
    • 32 位机上,int 长度是 4 字节
    • 64 位机上,int 长度通常是 4 字节(具体取决于编译器和平台)
  • 因此,在编码时不能想当然地写 2 或 4,而应使用 sizeof 来计算,例如 sizeof(int),这样可以避免错误,同时提高程序的健壮性。

字 (word)、字节 (byte)、半字 (half-word) 的理解

艺途心语于 2021-01-31 17:47:58 发布

概念

  • 字定义:总线一般设计用来传输固定大小的数据,这块数据被称为字(word)。一个字包含的字节数(即字的大小)是各种计算机系统的基本参数,且在不同的操作系统中通常是不同的。

    CPU 按照其处理信息的字长可以分为:8 位微处理器、16 位微处理器、32 位微处理器以及 64 位微处理器。

    CPU 最大能查找的地址范围称为寻址能力,CPU 的寻址能力以字节为单位。例如,32 位寻址的 CPU 可以寻址 (2^{32}) 大小的地址,即 4 GB,这也是为什么 32 位的 CPU 最大能搭配 4 GB 内存的原因,再多的话 CPU 就无法寻址了。

  • 字长(word size)

    • 字长也叫 字(word),CPU 和内存之间的数据传送单位通常是一个字长。
    • 字长 的大小取决于计算机的 数据总线 是多少位的。现代计算机的字长通常为 16 位、32 位或 64 位。
  • 数据总线(data bus)

    • 用于传输数据,是双向三态的总线。它可以将 CPU 的数据传送到存储器或 I/O 接口等其他部件,也可以将其他部件的数据传送到 CPU。
  • 地址总线(address bus)

    • 用于传输地址,是单向三态的总线。地址只能从 CPU 传向外部存储器或 I/O 端口。地址总线的位数决定了 CPU 可直接寻址的内存空间大小。
  • 控制总线(control bus)

    • 用来传送控制信号和时序信号。

      控制信号中,有的是微处理器送往存储器和 I/O 接口电路的,如读 / 写信号、片选信号、中断响应信号等;也有是其他部件反馈给 CPU 的,比如:中断申请信号、复位信号、总线请求信号、设备就绪信号等。
      因此,控制总线的传送方向由具体控制信号而定,一般是双向的,控制总线的位数要根据系统的实际控制需要而定。实际上,控制总线的具体情况主要取决于 CPU。

注意

  • 字的大小取决于具体系统的总线宽度。如果是 32 位的系统,则一个字(word)是 4 个字节(byte);如果是 64 位,则是 8 个字节(byte)。
  • 无论操作系统的 位宽 是多少,1 byte = 8 bit,半字为字的一半,双字(double word)为字(word)的 2 倍,这一点是不变的。
  • 一个 ASCII 字母占用 1 byte,一个汉字占用 2 byte
  • Intel 公司中用术语 字(word) 表示 16 位数据类型,双字(double word) 表示 32 位数据类型,四字(quad word) 表示 64 位数据类型。Intel 公司中无论是 32 位架构的机器还是 64 位架构的机器,它们都是从 16 位架构的基础上扩展的。

ARM 架构中的字节、半字、字理解

  • 字节(byte):在 ARM 体系结构和 8 位 / 16 位处理器体系结构中,字节的长度均为 8 位。
  • 半字(Half-Word):在 ARM 体系结构中,半字的长度为 16 位,2 个字节。这与 8 位 / 16 位处理器体系结构中字的长度一致。
  • 字(word):
    • 在 ARM 体系结构中,字的长度为 32 位(bit),4 个字节(byte)。
    • 在 8 位 / 16 位处理器体系结构中,字的长度一般为 16 位(bit),2 个字节。

字、半字、字节理解

Awen_y 于 2023-04-02 14:08:40 发布

前言

计算机中所说的字(word)、半字(Half-word)、字节(Byte)与我们平时所说的“字”的概念是不一样的,且针对不同平台,其大小长度也不相同。

一、根据处理器数据位宽区分

  • 字长:字长也叫字(word),是 CPU 和内存之间的数据传送单位。字长决定了处理器一次可以处理的二进制代码的长度,同时决定了其通用寄存器、内存储器、运算器的位数和数据总线宽度。我们所说的 8 位处理器、16 位处理器、32 位处理器、64 位处理器就是根据其字长的不同来区分的。
  • 字(word):总线一般设计用来传输固定大小的数据,这块数据被称为字。其大小取决于具体系统的总线宽度。
  • 半字(Half-Word):可以理解为字的一半的长度,但有例外,例如 ARM 的 16 位处理器的字和半字都是 16 位。
  • 字节(Byte):无论操作系统的位宽如何,8 位(bit)为一个字节(1 Byte)。

二、根据处理器平台区分

字的长度不仅与处理器字长相关,还与平台有关:

Intel 平台

Intel 处理器平台 64 位处理器 32 位处理器 16 位处理器
字(word) 16 位 16 位 16 位
半字(Half-Word) 8 位 8 位 8 位
字节(Byte) 8 位 8 位 8 位
双字(double word) 32 位 32 位 32 位

Intel 公司中无论是 32 位架构的机器还是 64 位架构的机器,都是从 16 位架构的基础上扩展的。

ARM 平台

ARM 处理器平台 32 位处理器 8/16 位处理器
字(word) 32 位 16 位
半字(Half-Word) 16 位 16 位
字节(Byte) 8 位 8 位
双字(double word) 64 位 32 位

注意:一个 ASCII 字母占用 1 byte,一个汉字占用 2 byte。

总结

因此,单纯问一个字占多少字节或多少位是没有意义的。


ARM 中的字、半字、字节是多少位?

wwwlyj123321 于 2018-06-25 09:19:37 发布

一、对于嵌入式底层开发

  • 字(Word):在 ARM 体系结构中,字的长度为 32 位;在 8 位 / 16 位处理器体系结构中,字的长度一般为 16 位。
  • 半字(Half-Word):在 ARM 体系结构中,半字的长度为 16 位,与 8 位 / 16 位处理器体系结构中字的长度一致。
  • 字节(Byte):在 ARM 体系结构和 8 位 / 16 位处理器体系结构中,字节的长度均为 8 位。

ARM 采用的是 32 位架构。ARM 约定如下:

  • Byte : 8 bits
  • Halfword :16 bits(2 byte)
  • Word :32 bits(4 byte)

二、对于应用程序开发

  1. 字节(byte):8 bit,即 8 个二进制位,一个 ASCII 字母占用的空间。
  2. 字(word):16 bit,一个汉字占用的空间。
  3. 双字(dword):32 bit。

例如在 Visual C++ 6.0 中,BYTE、WORD 和 DWORD 本质上都是一种无符号整型,它们在 WINDEF.H 中被定义如下:

typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;

也就是说,BYTE 是无符号的 char 型(char 型本质上也是一种 1 个字节的整型),WORD 是无符号 short 型,DWORD 是无符号 long 型。在 Visual C++ 6.0 中,char 型长度为 1 字节,short 型长度为 2 字节,int 和 long 型长度都为 4 字节,因此可以认为 BYTE、WORD 和 DWORD 定义的变量分别获得了 1 字节、2 字节和 4 字节内存。

从 Windows 的计算器也能看出一些端倪:

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第1张图片

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第2张图片

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第3张图片

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第4张图片

注:我的电脑是 WIN7 64BIT,CPU 是 I5 系列。可以看出这个计算器与电脑的操作系统和 CPU 的位数无关。

我在 VS2010 实验的结果如下:

系统环境:WIN7 64BIT 旗舰版

VS2010 64BIT

工程配置属性为 WIN32 和 X64 的结果都如下所示:

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第5张图片

字、半字、字节 | 从 CPU 架构到编程实践的数据类型解析_第6张图片

总结

字节永远是 8 bit,字的大小依赖于平台(可以通过 sizeof() 函数进行查看),但可以确定的是,字是多少位,半字永远是字的一半,双字永远是字的 2 倍大小。


【stm32f103 学习笔记】字、半字、字节和 sizeof()

MindfulBeing 2018-05-01

定义

  • 字、半字是根据处理器的特性决定的;字节则都是 8 bit。
  • sizeof() 返回一个数据类型的占用地址长度,增强程序在不同处理器间的兼容性。

CPU 按照其处理信息的字长可以分为:八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等。

CPU 最大能查找的地址范围称为寻址能力,CPU 的寻址能力以字节为单位。例如,32 位寻址的 CPU 可以寻址 (2^{32}) 大小的地址,即 4 GB,这也是为什么 32 位的 CPU 最大能搭配 4 GB 内存的原因,再多的话 CPU 就无法寻址了。

几个处理器比较

  1. STM32

    • STM32 是 32 bit 处理器,所以它的字是 32 bit(一次处理 4 字节长度的数据)。半字自然就是 16 bit(2 字节),字节是 8 bit。
    • STM32 和传统的 ARM 相比最大的好处就是不需要对齐,三种类型的数据可以在内存中无缝存放。而传统的 ARM7 或 ARM9 等是按照地址对齐的,即不管 8 bit 或者 16 bit 的数据都要占用 4 个字节的空间,这样的结果就是造成内存的浪费。
    • 寄存器的访问:
      • 半字型的寄存器用 u16 类型的变量访问,u8 只能访问低 8 位,u32 读的时候没问题,写的时候会因编译器的不同而出现偏差。
  2. MSP430

    • MSP430 是 16 bit 处理器,所以它的字是 16 bit。半字 = 字节 = 8 bit。

sizeof() 的使用

示例 1:int 类型的大小

VC++ 默认 intlong int, 长度是 4
TC 默认 intshort int, 长度是 2

int 类型所占的字节数依赖于机器的字长,有 16 位、32 位、64 位。我们现在所说的 32 位机、64 位机就是指这个。在 16 位机上 int 长度是 2,在 32 位机上长度是 4。因此,在编码时需要写 int 长度时,不能想当然地写 2 或 4,而应使用 sizeof 来计算,如 sizeof(int),这样可以避免错误,同时提高程序的兼容性。

示例 2:内存分配

假设 A 机器 int 占用 2 个字节,B 机器占用 4 字节,申请内存存放一个 int 数据。

如果写入:

int *i = (int*)malloc(2);

那么在 A 机器中能正常运行,但在 B 机器上则会报错。正确的写法是:

int *i = (int*)malloc(sizeof(int));

这样 A、B 机器中都能兼容。


参考资料

  • WORD 是 2Bytes 还是 4bytes?-enzo26-ChinaUnix博客
    http://blog.chinaunix.net/uid-21977330-id-3801847.html

  • 字、半字、字节的定义 - CSDN 博客
    https://blog.csdn.net/guosir_/article/details/78346472

  • 字 (word)、字节 (byte)、半字 (half-word) 的理解_word byte-CSDN 博客
    https://blog.csdn.net/breadheart/article/details/113482110

  • 字、半字、字节理解 - CSDN 博客
    https://blog.csdn.net/Yin_w/article/details/129909536

  • ARM 中的字、半字、字节是多少位? - CSDN 博客
    https://blog.csdn.net/wwwlyj123321/article/details/80796974

  • 【stm32f103 学习笔记】字、半字、字节和 sizeof()- 电子工程世界
    https://news.eeworld.com.cn/mcu/article_2018050138902.html

你可能感兴趣的:(computer,science,字,半字,字节)