新浦京81707con > 注册购买 > 【澳门XPJ】C语言程序判断计算机的CPU大小端,大

原标题:【澳门XPJ】C语言程序判断计算机的CPU大小端,大

浏览次数:163 时间:2019-11-13

c语言 union及 大端小端

union 关键字的用法与struct 的用法非常附近。

union 维护丰裕的长空来寄放多少个数据成员中的“意气风发种”,实际不是为每三个多少成员配置空间,在union 中具备的多少成员共用三个空中,同不时候只好存款和储蓄个中二个数目成员,全体的数据成员具备同等的序曲地址。例子如下:

union StateMachine
{
   char character;
   int number;
   char *str;
   double exp;
};

如何推断大器晚成台微Computer的CPU是多方面依然小字端对齐吗?

何人说本国未有NB的人、NB的好书!《C语言深度解剖》的第三行就写道"以含金量勇敢挑东周内外同类书籍"!!

**一个union 只安顿叁个足足大的空间以来容纳最大尺寸的多少成员**

    以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。

在C 里,union 的成员暗中认可属性页为public。union 首要用来压缩空间。

假设部分多少不容许在同时同期被用到,则能够动用union。

大器晚成、大小端格局对union 类型数据的影响

下边再看三个事例:

union
{
   int i;
   char a[2];
}*p, u;
p =&u;
p->a[0] = 0x39;
p->a[1] = 0x38;

p.i 的值应为多少啊?

    这里需要考虑存储模式:大端模式和小端模式。
  • 五头格局(Big_endian卡塔尔国:字数据的高字节存款和储蓄在低地址中,而字数据的低字节则贮存在高地址中。

    输出为0x39380000
    
  • 小端格局(Little_endian卡塔尔国:字数据的高字节存款和储蓄在高地址中,而字数据的低字节则存放在低地址中。

    输出为0x00003839  
    
    union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。如此一解释,上面的问题是否已经有了答案呢?
    

    二、怎样用程序确认当前系统的囤积格局?

    上述难点就如还比较简单,那来个有技艺含量的:

    • 请写三个C 函数,若微处理器是Big_endian 的,则返回0;若是Little_endian 的,则返回1。

      先解析一下,遵照地点关于大小端格局的概念,如果int 类型变量i 被早先化为1。

      • 以多方格局存款和储蓄,其内部存款和储蓄器布局如下图:

        澳门XPJ 1

        • 以小端形式存储,其内部存款和储蓄器布局如下图:

          澳门XPJ 2

          变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。既然如此,我们完全可以利用union 类型数据的特点:所有成员的起始地址一致。
          

          到近期,应该知道怎么写了吗?仿效答案如下:

          int checkSystem( )
          {
             union check
             {
                int i;
                char ch;
             } c;
             c.i = 1;
             return (c.ch ==1);
          }
          

          这两天您能够用那么些函数来测量检验你眼下系统的贮存方式了。当然你也得以不用函数而直白去查看内部存款和储蓄器来分明当前系统的存款和储蓄方式。如下图:

          澳门XPJ 3

          图中0x01 的值存在低地址上,表明当前系统为小端方式。

          唯独要证明的少数是,有个别系统恐怕还要支持那二种存款和储蓄形式,你能够用硬件跳线或在编写翻译器的选项中设置其积存情势。

          留个难点:在x86 系统下,输出的值为多少?< 喎?" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">#include intmain() { int a[5]={1,2,3,4,5}; int *ptr1=(int *)(&a 1); int *ptr2=(int *)((int)a 1); printf("%x,%x",ptr1[-1],*ptr2); return 0; }

          解答: 对于*ptr1应该比比较简单于看清

          sizeof(a)=20 a[5] 的分寸为 4*5=20个字节
          此刻内部存款和储蓄器内容为:

          a                                                        ptr[-1]   &a 1
          01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00        00
          

          &a 1 表示一次要加多18个字节 而 ptr1[-1]=以往偏移三个字节 所以ptr[-1]=5

          (int)a 1 跟 &a 1 分歧注意 相当的大 (int卡塔尔a 1 表示将a的地址变为整数之后加1,这里的撼动地址只是逻辑上加了三个单位

          a (int)a 1                                                  &a 1
          01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 00
          

          此时*ptr2指向的八个字节为 00 00 00 02是因为Computer应用小端形式 将 00 00 00 02强制转变到 int * 就改成了 02 00 00 00了
          介怀: 00 00 00 02那边的地址依次增大,所以02当时放在高地址

          union及 大端小端 union 关键字的用法与struct 的用法特别类。 union 维护充裕的半空中来贮存三个数据成员中的“风流倜傥种”,实际不是为每贰个...

   那么首先得领悟何为多边,何为小端,鲜明一下定义。

剧情是在作者讲union的时候说的,那时候笔者的确不太领会,只精晓是三种存款和储蓄方式,概念如下

   所谓大端方式,是指字数据的高字节存款和储蓄在低地址中,而字数据的低字节则寄存在高地址中。

多方情势:字数据的高字节存款和储蓄在低地址中,而字数据的低字节则寄放在高地址中。

   小端格式:与多边存款和储蓄格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址贮存的是字数据的高字节。

小端方式:字数据的高字节存款和储蓄在高地址中,而字数据的低字节则存放在低地址中。

   那么怎样行使C语言程序判别CPU是多方面依旧小端对齐吗?

还清楚有个艺术选取系统是哪类存款和储蓄情势及四个图:

   有多少个主意:

澳门XPJ 4

   方法大器晚成:直接运用看变量的内部存款和储蓄器值,这里需求动用一些调节和测量检验工夫。

/* 0大端,1小端 */
int checkSystem()
{
    union check
    {
        int i;
        char ch;
    }c;
    c.i=1;
    return (c.ch==1);
}

         

 

[cpp] view plaincopy
#include<stdio.h> 
 
void main() 

    short s=0x1234; 
    char * pTest=(char*)&s; 
    printf("%p %0X %X",&s,pTest[0],pTest[1]); 

接下来笔者一向往下看,境遇那样叁个题:在x86系统下,其值为多少?

以十四进制输出short型变量s在内部存储器中的字节布满。

int main()
{
    int a[4]={1,2,3,4};
    int *ptr1=(int*)(&a 1);
    int *ptr2=(int*)((int)a 1);

    print ("%x,%x",prt1[-1],*ptr2);

    return 0;
}

运作结果为:

先说ptr1,小编精晓 &a是整个数组的首地址,所以&a 1指到了全数数组前边

本文由新浦京81707con发布于注册购买,转载请注明出处:【澳门XPJ】C语言程序判断计算机的CPU大小端,大

关键词: 新浦京81707con

上一篇:也来谈谈数据库中的图象存取

下一篇:没有了