我在c编程的在线测试中找到了这个程序我在我的关卡上尝试了但是我无法弄清楚为什么这个程序的输出结果是64。
任何人都可以解释这背后的概念吗?
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a = 320;
char *ptr;
ptr = (char *)&a;
printf("%d",*ptr);
return 0;
}
输出:
64
三江源。
答案 0 :(得分:11)
A char *
仅指向一个字节。假设系统上的一个字节是8位,则数字320
占用2个字节。那些低字节是64,高字节是1,因为320 = 256 * 1 + 64
。这就是为什么你的计算机上得到64(little-endian计算机)。
但请注意,在其他平台上,即所谓的大端平台,结果也可能是1
(16位/ 2字节值的最重要字节)或0
(大于16位/ 2字节的值的最高有效字节。
请注意,所有这些都假定平台具有8位字节。如果它有,比如10位字节,你会再次获得不同的结果。幸运的是,现在大多数计算机都有8位字节。
答案 1 :(得分:5)
除非您知道:
,否则您将无法理解这一点以十六进制输出十进制数320。将其拆分为字节。假设int
是4个字节,您应该能够分辨出哪个字节的数字部分。
之后,考虑给定CPU的 endianess 并按该顺序对字节进行排序。 (MS字节优先或LS字节优先。)
代码访问在整数的最低地址处分配的字节。它包含的内容取决于CPU的endianess。您将获得十六进制0x40或十六进制0x00。
注意:您不应将char
用于此类事情,因为它具有实现定义的签名。如果数据字节包含大于0x7F的值,您可能会得到一些非常奇怪的错误,这些错误在多个编译器中不一致地出现/消失。在进行任何形式的位/字节操作时,始终使用uint8_t*
。
您可以通过将38替换为38来暴露此错误。您的小端系统可能会打印-128或128,您将在不同的编译器上获得不同的结果。
答案 2 :(得分:0)
Int
是four
字节数据字节,而char
是一个字节数据字节,char指针可以保持地址一个字节。 320
的二进制值为00000000 00000000 00000001 01000000
。因此,char pointer
ptr
仅指向first byte
。
*ptr
,即第一个字节的内容为01000000
,其十进制值为64
。
答案 3 :(得分:0)
@Lundin所说的就足够了。 顺便说一下,也许一些基础知识是有帮助的。 320 = 0x0140。一个int = 4个字符。因此,当打印第一个字节时,由于cpu endianess,它输出0x40 = 64。
答案 4 :(得分:0)
ptr是一个char的指针。因此* ptr将给出a的char值。 char只占用1个字节,因此它在255之后重复其值。即256变为0,257变为1,依此类推。因此320变为64.