int a = 0x12345678; char *p = (char *)&a; 为什么*p的值为0x78
时间: 2024-04-22 21:24:08 浏览: 25
在段代码中,我们将一个整型变量 `a` 的地址强制转换为一个字符指针 `p`。这意味着 `p` 指向了 `a` 的起始地址,并且我们可以通过 `*p` 来访问 `a` 的内存。
在小端机器上,多字节数据的最低有效字节存储在起始地址,而最高有效字节存储在结束地址。对于一个 32 位整型变量 `a`,其内存布局如下所示:
```
高地址 --> 0x12 | 0x34 | 0x56 | 0x78 <-- 低地址
```
当我们通过 `*p` 访问 `a` 的内存时,由于 `p` 指向 `a` 的起始地址,所以 `*p` 的值为 `0x78`,即最低有效字节的值。
需要注意的是,这种结果是特定于小端机器的。在大端机器上,多字节数据的最高有效字节存储在起始地址,而最低有效字节存储在结束地址。因此,在大端机器上,`*p` 的值将为 `0x12`。
相关问题
32位操作系统 unsigned char*p1=(unsigned char *)0x801000; unsigned int* p2=(unsigned long*)0x810000; P1+5=? P2+5=? Class A{},sizeof(A)= ?
在32位操作系统中,指针的大小为4个字节。
对于问题一:`unsigned char *p1 = (unsigned char *)0x801000;` 表示将地址 `0x801000` 强制转换为 `unsigned char*` 类型的指针 `p1`。而 `P1+5` 的结果是 `0x801005`,因为 `unsigned char` 类型的指针每次偏移1个字节。
对于问题二:`unsigned int *p2 = (unsigned long *)0x810000;` 表示将地址 `0x810000` 强制转换为 `unsigned int*` 类型的指针 `p2`。而 `P2+5` 的结果是 `0x810014`,因为 `unsigned int` 类型的指针每次偏移4个字节。
对于问题三:`sizeof(A)` 表示类 `A` 的大小。这取决于类的成员变量和对齐方式。通常情况下,类的大小是其成员变量大小的总和,并且可能会根据编译器和特定系统的对齐要求进行调整。您可以使用 `sizeof(A)` 来获取类 `A` 的大小。
为什么定义char a=0x90 输出的是ffffff90
在C语言中,char类型是一个字节(8位)大小的数据类型,它可以存储-128到127之间的整数。在使用十六进制数赋值给char类型变量时,需要注意以下两点:
1. 如果十六进制数的最高位是1,那么在将它赋值给char类型变量时,会被当作一个负数来处理。例如,0x90的最高位是1,所以它被当作一个负数来处理。
2. 在将char类型转换为其他类型(比如int)时,会进行符号扩展。也就是说,如果char类型变量的值是负数,那么在转换为int类型时,高位会被填充为1,否则高位会被填充为0。
因此,当你定义char a=0x90时,a被当作一个负数来处理,其值为-112(0x90表示的是-112这个数),在将其转换为int类型时,高位被填充为1,最后输出的结果就是ffffff90。