位和字节填充
Bits and bytes filling
已将代码编写成以下形式:
int i = 0xFF;
并且知道在我的系统上 int 类型有 4 个字节,是否有一种标准方法可以预测那些缺失的位将如何填充到 i 变量中,即它总是被填充为:
0xFFFFFFFF
或
0xFF000000
也就是说,上面的例子是关于这样一个问题,我们可以预测其余的位是用 0 还是 1 填充吗?
另一个问题是,有没有办法知道它是从后面填充还是从前面填充:
0xFF000000 //<<- 位在后面填充
或
0x000000FF //<<- 从前面填充的位
int i = 0xFF;
相当于
int i = 255;
哪些位相当于
0x000000FF
其余位将为 0,始终。当存储到内存中时,这将表示为 FF 00 00 00
或 00 00 00 FF
- 这取决于机器的字节顺序。
第一个是小端,- FF 00 00 00
通常 英特尔机器使用,尽管正如 Toby 在评论中指出的那样Speight,IA-64 架构可以配置为使用任一布局。
第二个例子是big-endian。 - 00 00 00 FF
int i = 0xFF;
4 字节整数用 FF 填充 1 个字节,用 00 填充另外 3 个字节。
另一方面,char i = 0xFF;
(使用 1 字节字符)用 FF 填充 1 个字节,您无法保证接下来的 3 个字节是什么(无论是它们的值,还是它们是否用于其他变量等等)。
字节方向
FF 00 00 00
00 00 00 FF
被称为 CPU 的 "endianess"(并且 OS、编译器等都是以匹配它的方式制作的)。 "Normal" 今天的计算机是 "little-endian",即 FF 00 00 00
,尽管大端存在于手机等设备中
但是,您不会直接在程序中注意到字节顺序:如果您将 int 与此值进行比较,它将等于 00 00 00 FF
这在数学上是正确的(或者从另一个方向说:当您将 000000FF 写入你的源文件,编译器会改变它,实际上你是在将 int 值与 FF 00 00 00
) 进行比较。要获得 "real" 表示,必须转换为 byte/char 指针并单独访问 4 个字节。
已将代码编写成以下形式:
int i = 0xFF;
并且知道在我的系统上 int 类型有 4 个字节,是否有一种标准方法可以预测那些缺失的位将如何填充到 i 变量中,即它总是被填充为:
0xFFFFFFFF
或
0xFF000000
也就是说,上面的例子是关于这样一个问题,我们可以预测其余的位是用 0 还是 1 填充吗?
另一个问题是,有没有办法知道它是从后面填充还是从前面填充:
0xFF000000 //<<- 位在后面填充
或
0x000000FF //<<- 从前面填充的位
int i = 0xFF;
相当于
int i = 255;
哪些位相当于
0x000000FF
其余位将为 0,始终。当存储到内存中时,这将表示为 FF 00 00 00
或 00 00 00 FF
- 这取决于机器的字节顺序。
第一个是小端,- FF 00 00 00
通常 英特尔机器使用,尽管正如 Toby 在评论中指出的那样Speight,IA-64 架构可以配置为使用任一布局。
第二个例子是big-endian。 - 00 00 00 FF
int i = 0xFF;
4 字节整数用 FF 填充 1 个字节,用 00 填充另外 3 个字节。
char i = 0xFF;
(使用 1 字节字符)用 FF 填充 1 个字节,您无法保证接下来的 3 个字节是什么(无论是它们的值,还是它们是否用于其他变量等等)。
字节方向
FF 00 00 00
00 00 00 FF
被称为 CPU 的 "endianess"(并且 OS、编译器等都是以匹配它的方式制作的)。 "Normal" 今天的计算机是 "little-endian",即 FF 00 00 00
,尽管大端存在于手机等设备中
但是,您不会直接在程序中注意到字节顺序:如果您将 int 与此值进行比较,它将等于 00 00 00 FF
这在数学上是正确的(或者从另一个方向说:当您将 000000FF 写入你的源文件,编译器会改变它,实际上你是在将 int 值与 FF 00 00 00
) 进行比较。要获得 "real" 表示,必须转换为 byte/char 指针并单独访问 4 个字节。