十六进制数为什么是从低字节到高字节存储?别的进制也是这样存储的吗

文章讲述了C语言中指针和内存模型的交互,特别是char*类型的指针如何影响整数变量的存储。重点讨论了大端序和小端序在内存中存储十六进制数的区别,以及字节序对不同编译器和处理器的影响。
摘要由CSDN通过智能技术生成

        今天做题遇到这样一个题目,问下方代码输出 结果是?

#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。 总的来说,小端字节序在现代计算机系统中更为常见,尤其是在性能和存储效率方面具有优势。然而,在选择字节序时,还需要考虑到与特定硬件平台的兼容性,以及在多平台环境中的数据交换问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值