• linux打印地址时是0xXXXX XXXX XXXX,为什么64位机指针只用48个位?


    Example:

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <functional>   //std::function
     6 
     7 using std::cout;
     8 using std::endl;
     9 
    10 int func(int *p){
    11   *p = 10;
    12   return *p;
    13 }
    14 
    15 int func1(int p){
    16   // int b =30;
    17   p=20;
    18   return p;
    19 }
    20 
    21 //c++
    22 void swap(int &a,int &b){
    23   printf("address in swap(),the address of a and b:%p %p
    ",&a,&b);
    24   int temp =a;
    25   a=b;
    26   b=temp;
    27 }
    28 
    29 //c
    30 void swap1(int *a,int *b){
    31   printf("address in swap1(),the address of a and b:%p %p
    ",a,b);
    32   // printf("address in main(),the address of a and b:%p %p
    ",&a,&b);
    33   int temp =*a;
    34   printf("address in swap1(),the address of temp:%p
    ",temp);
    35   // printf("address in swap1(),the address of temp:%d
    ",*temp);
    36   *a=*b;
    37   // printf("address in swap1(),the address of temp:%d
    ",*temp);
    38   *b=temp;
    39 }
    40 
    41 void swap2(int a,int b){
    42   printf("address in swap2(),the address of a and b:%p %p
    ",&a,&b);
    43   int temp =a;
    44   a=b;
    45   b=temp;
    46 }
    47 
    48 int main(){
    49   int a =5;
    50   // int *ptr =&a;
    51   // int *ptr=NULL;
    52   // a=func(&a);
    53   // // cout << "*ptr="<< *ptr << endl;
    54   // cout << "a="<< a << endl;
    55 
    56   // a=func1(a);
    57   // cout << "a="<< func1(a) << endl;
    58 
    59 //swqp
    60   int x=4,y=100;
    61   printf("address in main(),the address of a and b:%p %p
    ",&x,&y);
    62   printf("address in main(),the address of a and b:%p %p
    ",x,y);
    63   cout <<"交换前: "<< "x="<<x<<"y="<<y<<endl;
    64   // swap(x,y);
    65   swap1(&x,&y);
    66   // swap2(x,y);
    67   cout << "交换后:"<< "x="<<x<<"y="<<y<<endl;
    68   return 0;
    69 }
    View Code

    linux打印出某地址时

    那为什么我64位的机器,打印出来的指针却是48位呢?

    只用48位的原因很简单:因为现在还用不到完整的64位寻址空间,所以硬件也没必要支持那么多位的地址。

    出现这样结果的原因是x86_64处理器硬件限制,为什么要对处理器硬件做限制?因为地址宽度越大,操作系统做虚拟地址转换时越累

    接着我在visual studio 2015 进行编译打印,下面给出我x86(32位)、x64(64位)的结果,结果如下:

    x86

    x64

    总结:

    linux上的编译器也不尽相同,会出现寻址空间有差异,我的是48位 ;至于window上vs上选不同位数的编译器,有相应的结果。(32位,64位)

  • 相关阅读:
    入门OJ 1278【关系网络】
    HDU 1372【Knight Moves】
    ZOJ 1047【Image Perimeters】
    log4J——在Spring中的使用
    实用性很强的文章(不来源于博客园)
    详解AOP——用配置文件的方式实现AOP
    Spring与Web项目整合的原理
    IOC——Spring的bean的管理(注解方式)
    IOC——Spring的bean的管理(xml配置文件)
    关于XML文件
  • 原文地址:https://www.cnblogs.com/Hwangzhiyoung/p/8602372.html
Copyright © 2020-2023  润新知