c - 使用指针取消引用生成的模糊输出?

标签 c pointers output dereference

<分区>

我遇到了以下程序,无法理解输出是如何变成 -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 的。有两个原因:一个是编译器的 charsigned(char 是有符号类型还是无符号类型取决于编译器)。第二个原因是因为two's complement算术。 Two's complement是一种能够在现代计算机等二进制机器上对有符号整数进行编码的方法。

基本上,对于单个 8 位字节,您可以通过取(无符号)十进制值减去 256 (28) 得到负值。 0x93的无符号十进制值为147147 - 256等于-109

关于c - 使用指针取消引用生成的模糊输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41736624/

相关文章:

c - 如何在C中解析文本文件中标签之间的数据

css - 从 'GtkButton' 到 'GtkEntry' 的无效转换

objective-c - 需要帮助理解 c 中的指针

无法理解 C 中指针的内存地址结果

java - 为什么我在 stdout println 之后看不到我的 stderr println?

C - 返回字符指针数组中重复次数最多/出现次数最多的字符串

c - 如何通过pdf阅读器找出pdf文件是否为 "blocked"

c - C中的结构和指针

javascript - 将 javascript 文件内容包含在 ob_start 缓冲区中

c++ - 错误输出包括最后几行代码