在判定机器采用大端还是小端存储时,可以按字节输出某数据对象的机器表示的位模式。机器表示的位模式即某数据对象在内存中的二进制串。下面是一个访问数据对象位模式的方法:

//传入一个数据对象,从低地址到高地址按字节输出这个对象的每字节的十六进制表示
void printByte(unsigned char* a,int n)
{
for( int i=0; i<n; i++ ) {
printf("%x ",a[i]);
}
printf("\n");
}

上面的printByte函数的功能是:以参数*a传入一个数据对象的地址,以及你想打印的以这个地址为起始地址的连续的字节数量n,printByte打印出这连续的n个字节内存的位模式的十六进制表示。我们使用了一个unsigned char* 类型的指针变量,它以一字节大小解读所指向的数据,并以"%x"格式输出这个一字节大小的数据。

我们定义一个int变量并打印它的位模式:

int x = 128;
printByte((unsigned char*)&x,sizeof(int))

可以看到输出为:

上面的输出也表示,这里实验的机器使用小端存储,即数据对象的低位部分存储在低地址部分。

在printByte函数中,需要注意:char* 型的指针指向的同样是一字节大小的数据,但此处一定要用unsigned char* 类型,而不能用char* 类型。因为"%x"是以十六进制形式输出int型的变量,所以,如果printByte的参数设置为char* 类型,在使用%x输出时,会将char类型隐式转换为int类型。此时,在上面的例子中,x值为128,其低8位的位模式为:1000 0000,即0x80,对于char型变量,其真值为-128。转换成int型变量后,位模式为:1111 1111 1111 1111 1111 1111 1000 0000 (补码编码),即0xffffff80:

void printByte(char* a,int n)
{
for( int i=0; i<n; i++ ) {
printf("%x ",a[i]);
}
printf("\n");
} int main()
{
int x = 128;
printByte((char*)&x,sizeof(int));
return 0;
}

输出结果为:

所以,在这个方法打印内存的位模式时,参数指针一定是unsigned char* 类型,而不能是char*类型。

C语言访问数据对象在内存中真实位模式的一个方法的更多相关文章

  1. JVM运行时数据区及对象在内存中初始化的过程

    JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...

  2. java对象在内存中的结构(HotSpot虚拟机)

    一.对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 从上面的这张图里面可以 ...

  3. java对象在内存中的结构

    在HotspotJVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢?要知道一个对象的大 ...

  4. Java中对象在内存中的大小、分配等问题

    Java创建一个对象的过程 是否对象指向的类已经加载到内存了 如果没有加载,就要经过load.linking(verification.preparation.resolution).initiali ...

  5. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  6. JVM中,对象在内存中的布局

    在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机 ...

  7. 线程基础知识 03 synchronized锁(对象在内存的布局和加上锁后对象在内存中的变化)

    1 线程不安全演示 public class ThreadAndLockTest1 { private static int a = 0; public static void main(String ...

  8. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  9. CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写

    Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...

  10. PHP面向对象(PHP对象在内存中的分配)

    对 像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻 辑上 说大体上是分为4 段,栈空间段. ...

随机推荐

  1. OVS学习博客推荐

    博客学习 大致看一遍 openvswitch处理upcall过程分析 upcall-cost分析 连接跟踪(conntrack):原理.应用及 Linux 内核实现 ovs upcall处理流程 Li ...

  2. Double-Checked Locking 双重检查锁问题

    Code Correctness: Double-Checked Locking Abstract Double-checked locking 是一种不正确的用法,并不能达到预期目标. Explan ...

  3. Linux & 标准C语言学习 <DAY9_2>

    一.进程映像     程序:存储在磁盘上的可执行文件(二进制文件.脚本文件)     进程:正在系统中运行的程序     进程映像:进程的内存分布情况         text(代码段):       ...

  4. 使用LRU加速python应用

    操作系统 :CentOS 7.6.1810_x64 Python 版本 : 3.9.12 一.背景描述 使用python开发过程中,会遇到需要使用缓存加速应用的情况,比如下面这些场景: 数据转换加速 ...

  5. 2023GDKOI总结

    2023GDKOI总结 说明:不是GD选手,只是因为来zsjz集训就顺便参加了GDKOI,不过也不参与GD选手排名. 考前看了看GDKOI2021的题,当时是考了3天,每天4题,而里面只有一道题是我一 ...

  6. HDFS 组织架构

    一.HDFS 概述 HDFS 产生背景:随着数据量越来越多,一个系统存储不下所有的数据,那么就需要分配到多个操作系统的磁盘中进行存储,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就 ...

  7. wx相关

    1.vue图片预览放大 https://www.jianshu.com/p/e3350aa1b0d0 2.js图片文件格式的转换 https://www.jianshu.com/p/ea757f90b ...

  8. Trie树结构

    PrefixTree 208. 实现 Trie (前缀树) Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构 ...

  9. 在k8s(kubernetes)上安装 ingress V1.1.3

    介绍 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由.流量路由由 Ingress 资源上定义的规则控制. 下面是一个将所有流量都发送到同一 Service 的简单 In ...

  10. kubernetes核心实战(七)--- job、CronJob、Secret

    10.job任务 使用perl,做pi的圆周率计算 [root@k8s-master-node1 ~/yaml/test]# vim job.yaml [root@k8s-master-node1 ~ ...