今天做题遇到这样一个题目,问下方代码输出 结果是?
#include <stdio.h>
int main()
{
int a = 0x11223344;
char* pc = (char*)&a;
*pc = 0;
printf("%x\n", a);
return 0;
}
A. 00223344
B. 0
C. 11223300
D. 112233
答案解析:
假设,a变量的地址为0xCCCCCCCC,则a变量在内存中的模型为:
0xCCCCCCCC| 44 |
0xCCCCCCCD| 33 |
0xCCCCCCCE| 22 |
0xCCCCCCCF| 11 |
char*类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char*类型。
char *pc = (char*)&a; pc实际指向的是整形变量a的空间,即pc的内容为0xCCCCCCCC,即44,
*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300
因此:选择C
上方关于char*等不同类型指针变量的知识也很重要,请阅读另一篇博客http://t.csdnimg.cn/9mKdf
我的疑问在于:十六进制数为什么是从低字节到高字节存储? 因为是采用小端序存储
int a = 0x 11223344;
11<------------------22<-------------------33<------------------44
高字节<-----------------------------------------------------------低字节
0xCCCCCCCF 0xCCCCCCCE 0xCCCCCCCD 0xCCCCCCCC
高位地址---------------------------------------------------------低位地址
不同的计算机系统可能采用不同的字节序来存储数据,但十六进制数本身并没有固定的存储顺序。
在计算机系统中,字节序(Endian)指的是多字节数据在内存中存放的顺序。有两种常见的字节序:
大端序(Big-endian):将最高位字节(也称为高位字节)存储在最低的内存地址上,即地址较低的部分存储高位字节。
小端序(Little-endian):将最低位字节(也称为低位字节)存储在最低的内存地址上,即地址较低的部分存储低位字节。
对于十六进制数0x11223344,如果系统采用的是大端序,那么它在内存中的存储顺序将是11、22、33、44,从地址由低到高排列。而如果系统采用的是小端序,那么存储顺序将是44、33、22、11。
此外,并非所有进制的数都以同样的方式存储。例如,二进制数通常直接映射到内存中,每个位对应一个内存地址位,而十进制数通常会被转换为机器的原生表示形式(如二进制或十六进制)后再进行存储。
总的来说,十六进制数本身并没有固定的存储顺序,它的存储方式取决于计算机系统的字节序。不同的计算机架构可能采用不同的字节序,这是计算机设计和操作系统的一部分。
哪些编译器采用小端位,哪些用大端位?
目前,主流的编译器和处理器大多采用小端字节序。例如,常用的X86架构和许多ARM处理器都是小端模式。然而,也有一些系统使用大端模式,如KEIL C51。 总的来说,小端字节序在现代计算机系统中更为常见,尤其是在性能和存储效率方面具有优势。然而,在选择字节序时,还需要考虑到与特定硬件平台的兼容性,以及在多平台环境中的数据交换问题。