我遇到了以下程序,无法理解输出是如何变成 -109 1683
的。输出是如何变成这样的?
#include <stdio.h>
int main()
{
int k = 1683;
char *a = (char *)&k;
int *l = &k;
printf("%d " , *a);
printf("%d" , *l);
}
Output is : -109 1683
取消引用指针 a
如何得到 -109
?
我希望它读取四字节整数的第一个字节。
1683
在二进制表示中是 00000000 00000000 00000110 10010011
。所以读取第一个字节意味着输出应该是 0 1683
。幕后发生了什么,我听说了一些关于架构字节序的事情,但无法理解。
整数 1683
等于 0x00000693
(int
在现代系统上通常是 32 位)。在 little-endian 上系统(如 x86 和 x86-64)它在内存中的布局如下
+------+------+------+------+------+------+------+------+
| 0x93 | 0x06 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
+------+------+------+------+------+------+------+------+
当你初始化指针 a
时,你让它指向该序列中的第一个字节,即包含值 0x93
的字节,所以这就是你得到的值您取消引用 a
。
那么现在的问题是值 0x93
是如何变成 -109
的。有两个原因:一个是编译器的 char
是 signed
(char
是有符号类型还是无符号类型取决于编译器)。第二个原因是因为two's complement算术。 Two's complement是一种能够在现代计算机等二进制机器上对有符号整数进行编码的方法。
基本上,对于单个 8 位字节,您可以通过取(无符号)十进制值减去 256 (28) 得到负值。 0x93
的无符号十进制值为147
,147 - 256
等于-109
。