位和字节填充

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 0000 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 个字节。