关于使用gcc -m32编译时的两个问题

关于使用gcc -m32编译时的两个问题

int a = 10;
printf("sizeof(a) = %ld\n", sizeof(a));
printf("&a = %p\n", &a);


在默认编译后运行结果:


inux@ubuntu:~/Class/week01$ gcc var-02.c 

linux@ubuntu:~/Class/week01$ ./a.out 

sizeof(a) = 4

&a = 0x7fff46f7cb74


在使用32位系统编译运行结果:

linux@ubuntu:~/Class/week01$ gcc -m32 var-02.c 

var-02.c: In function ‘main’:

var-02.c:7:24: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘unsigned int’ [-Wformat=]

  printf("sizeof(a) = %ld\n", sizeof(a));

                      ~~^

                      %d

linux@ubuntu:~/Class/week01$ ./a.out 

sizeof(a) = 4

&a = 0xffd2c358


第一个问题:既然sizeof都是4,证明都是占4个字节,为什么&a寻址一个是8位4个字节,另一个是12位6个字节?这里的内存地址位数是根据什么决定的?


第二个问题:在使用-m32编译时,提示sizeof(a)的结果是unsigned int类型,需要使用%d来输出,那这里实际开发中应该怎么写?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
大白老师 2023-07-13 22:22:44
问题2:用%ud输出就行,它对应unsigned int类型
  • 提问者 黑鸽 #1

    我的意思是:

        在编码的时候,不知道编译的时候会使用-m32还是-m64,这样我就不知道sizeof的结果是unsigned int还是unsigned long,也就不知道改写%ld还是%d

    也就是说:有没有兼容的写法?还是根本不需要做这种兼容处理?

    2023-07-13 22:36:53
  • 中年猿叔 回复 提问者 黑鸽 #2

    编码的时候要确定自己程序是在32 bit机器还是64bit机器上运行,这样就知道自己程序的运行结果。这也是为什么32bit程序和64bit程序存在兼容性问题

    2023-07-14 09:49:28
大白老师 2023-07-13 22:21:41
跟sizef无关,记住sizeof输出只是变量a的大小,a的大小和地址的大小没关系!你可以测试char double类型大小都不一样,但是地址大小都是4或8
大白老师 2023-07-13 22:19:59
问题1:首先要明-m32的含义,表示以32位的编译器来标准代码,不添加就是以64位的编译器编制代码!输出地址的时候,32位编译器以在4byte大小作为地址,64位编译器以8byte作为地址,所以结果不同
  • 提问者 黑鸽 #1

    那在64位的情况下,为什么是12位,如果是以8byte作为地址,不是应该是16位吗?

    &a = 0x7fff46f7cb74

    2023-07-13 22:29:45
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师