C 变量类型的大小取决于作者对该编译器和目标的选择。根据定义,没有固定的规则。对于一个(版本)编译器,一个 int 可以是一个目标的 16 位和另一个目标的 32 位。对于两个不同的编译器,相同的目标一个可以选择 16 位另一个 32 位。并且大小不必与通用寄存器大小一致 - 作者的选择。
这就是 stdint.h 的全部内容,它最终是编译器的一部分,并将 8、16、32、64 等大小之间的点与编译器为该目标选择的大小连接起来,一个特定版本的例如,用于 x86 的 stdint.h 的 gcc 预计不会与相同版本的 gcc msp430 stdint.h 兼容。
这里发生的事情正如你所描述的那样。
char (1 byte)
short (2 bytes)
long (4 bytes)
long long (8 bytes)
汇编语言特定于汇编器,工具,而不是目标,汇编器的作者可以选择他们选择的任何语法和助记符等。与芯片文档有些相关是理智的道路,但肯定没有汇编语言的规则。特别是您如何定义数据项。在这里,.word 表示 16 位值,.byte 表示 8 位值。
2048 = 0x0000....00800
-2048 = 0xFFFF....FF800
所以如果你剪掉 2048 的低 8 位你得到 0x00,你砍掉低 16 位你得到 0x0800,低 32 位你得到 0x00000800,所以
.byte 0x00
.word 0x0800
假设小端:
.word 0x0800
.word 0x0000
适用于 8、16 和 32 位
十进制:
.byte 0
.word 2048
.word 2048
.word 0
或
.word 2048,0
取决于汇编器的语法
对于负版-2048
.byte 0x00
.word 0xF800
.word 0xF800
.word 0xFFFF
对于该数字的 8、16 和 32 位版本
十进制
.byte 0
.word -2048
.word -2048
.word -1
一个 long long -2048 将是
.word -2048
.word -1
.word -1
.word -1
或 long long -2048 也可以实现为:
.byte 0
.byte -8
.byte -1
.byte -1
.byte -1
.byte -1
.byte -1
.byte -1
两者都在二进制文件中生成完全相同的数据。