搜索
bottom↓
回复: 17

对于64bit的系统来说,long long 和long 是一回事吧

[复制链接]

出0入0汤圆

发表于 2016-11-23 15:42:43 | 显示全部楼层 |阅读模式
在64bit的平台上用sizeof(long long)和size(long)都返回8.
然后查看/usr/include/stdint.h 这个文件发现:

48 typedef unsigned char   uint8_t;
49 typedef unsigned short int  uint16_t;
50 #ifndef __uint32_t_defined
51 typedef unsigned int    uint32_t;
52 # define __uint32_t_defined
53 #endif
54 #if __WORDSIZE == 64
55 typedef unsigned long int uint64_t;
56 #else
57 __extension__
58 typedef unsigned long long int  uint64_t;
59 #endif

理解为:
在32bits时,系统能用long表示的最大位数是32位,要想表示64位需要用两个long类型的来凑一下;
在64bits时,系统的long本身就能表示64位了,所以就不用longlong这样表示64位了,但是如果用long long按理不一样是128位了吗?这个就应该和编译器有关了吧?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2016-11-23 16:00:53 | 显示全部楼层
查了下,使用__int128可以定义一个128位的变量,占16个字节

出0入8汤圆

发表于 2016-11-23 16:01:11 | 显示全部楼层
long 一般与 CPU 的字长有关。
long long 的要求是至少 8 字节,一般也就是取 8 字节,这主要还是要看编译器了。

出0入0汤圆

发表于 2016-11-23 16:44:37 | 显示全部楼层
现在的64位系统只是寻址采用64位吧?处理精度好像还是32位的。

出0入0汤圆

发表于 2016-11-23 19:03:09 | 显示全部楼层
你试下int是不是也是64位的?

出0入54汤圆

发表于 2016-11-23 19:18:23 | 显示全部楼层
我测试是long  8字节 ,int 4字节

出300入477汤圆

发表于 2016-11-23 19:18:51 来自手机 | 显示全部楼层
linux64就是这样,long变成了64位。但win64就不一样,long没变还是32位。微软的说法是方便程序移植

出0入8汤圆

发表于 2016-11-23 19:19:55 来自手机 | 显示全部楼层
yu_studio 发表于 2016-11-23 19:03
你试下int是不是也是64位的?

int 是 32 位宽的,一般来说是这样的,
留待楼主的实验结果。

出0入442汤圆

发表于 2016-11-23 19:26:51 来自手机 | 显示全部楼层
redroof 发表于 2016-11-23 19:18
linux64就是这样,long变成了64位。但win64就不一样,long没变还是32位。微软的说法是方便程序移植 ...

所以通常要用size_t计算大小和偏移量

出0入442汤圆

发表于 2016-11-23 19:27:55 来自手机 | 显示全部楼层
gzfslt 发表于 2016-11-23 16:44
现在的64位系统只是寻址采用64位吧?处理精度好像还是32位的。

cpu字长全部64位,但是兼容32位。寻址之类看情况定。

出0入0汤圆

发表于 2016-11-23 19:36:34 | 显示全部楼层
https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
64bit下有很多类型模型,不一定哪个系统或者某个系统的配置下支持哪个。

归根结底是C的类型定义问题。C的整数类型只定义了rank关系和最小的bit数,没有上限。所以在高位数系统上怎么搞都行了。

出300入477汤圆

发表于 2016-11-23 21:11:59 来自手机 | 显示全部楼层
wye11083 发表于 2016-11-23 19:26
所以通常要用size_t计算大小和偏移量

对,size_t就是一个跟指针同样长度的无符号整数。在32位系统中是32位,在64位系统中就是64位

出0入0汤圆

发表于 2016-11-23 21:40:59 | 显示全部楼层
主要看编译器

出0入0汤圆

发表于 2016-11-23 21:45:25 | 显示全部楼层
这个和编译器有关吧

出0入8汤圆

发表于 2016-11-24 09:16:42 | 显示全部楼层
主要是看编译器的设定

出0入0汤圆

 楼主| 发表于 2016-11-24 10:07:32 | 显示全部楼层
系统环境为:
  1. Linux zwfedora23 4.4.9-300.fc23.x86_64+debug #1 SMP Wed May 4 23:44:03 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
复制代码


gcc版本为:
  1. Using built-in specs.
  2. COLLECT_GCC=gcc
  3. COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
  4. Target: x86_64-redhat-linux
  5. Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
  6. Thread model: posix
  7. gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
复制代码


简单测试代码:
  1.   1 #include<stdio.h>
  2.   2 #include<string.h>
  3.   3 #include<stdlib.h>
  4.   4 //#include<stdint.h>
  5.   5
  6.   6
  7.   7 int main(void)
  8.   8 {
  9.   9   printf("sizeof(long long)=%d\n",sizeof(long long));
  10. 10   printf("sizeof(signed long)=%d\n",sizeof(signed long));
  11. 11   printf("sizeof(unsigned long)=%d\n",sizeof(unsigned long));
  12. 12   printf("sizeof(int)=%d\n",sizeof(int));
  13. 13   printf("sizeof(short int)=%d\n",sizeof(short int));
  14. 14   printf("sizeof(int64_t)=%d\n",sizeof(int64_t));
  15. 15   printf("sizeof(__int128)=%d\n",sizeof(__int128));
  16. 16   //printf("sizeof(__int256)=%d\n",sizeof(__int256));
  17. 17
  18. 18   return 0;
  19. 19 }
复制代码

运行结果:
  1. sizeof(long long)=8
  2. sizeof(signed long)=8
  3. sizeof(unsigned long)=8
  4. sizeof(int)=4
  5. sizeof(short int)=2
  6. sizeof(int64_t)=8
  7. sizeof(__int128)=16
复制代码

出0入0汤圆

发表于 2016-11-24 10:54:16 | 显示全部楼层
redroof 发表于 2016-11-23 21:11
对,size_t就是一个跟指针同样长度的无符号整数。在32位系统中是32位,在64位系统中就是64位 ...

Linux X32。。。 。。。

Linux 64Bit下可以有很多奇异的事情发生……

出0入0汤圆

发表于 2016-11-24 11:45:29 | 显示全部楼层
所以老老实实的用C99规定的可移植的int32_t这种吧。不管啥系统都不怕。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 17:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表