winterw 发表于 2016-11-23 15:42:43

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

在64bit的平台上用sizeof(long long)和size(long)都返回8.
然后查看/usr/include/stdint.h 这个文件发现:

48 typedef unsigned char   uint8_t;
49 typedef unsigned short intuint16_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 intuint64_t;
59 #endif

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

winterw 发表于 2016-11-23 16:00:53

查了下,使用__int128可以定义一个128位的变量,占16个字节

security 发表于 2016-11-23 16:01:11

long 一般与 CPU 的字长有关。
long long 的要求是至少 8 字节,一般也就是取 8 字节,这主要还是要看编译器了。

gzfslt 发表于 2016-11-23 16:44:37

现在的64位系统只是寻址采用64位吧?处理精度好像还是32位的。

yu_studio 发表于 2016-11-23 19:03:09

你试下int是不是也是64位的?

lusson 发表于 2016-11-23 19:18:23

我测试是long8字节 ,int 4字节

redroof 发表于 2016-11-23 19:18:51

linux64就是这样,long变成了64位。但win64就不一样,long没变还是32位。微软的说法是方便程序移植

security 发表于 2016-11-23 19:19:55

yu_studio 发表于 2016-11-23 19:03
你试下int是不是也是64位的?

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

wye11083 发表于 2016-11-23 19:26:51

redroof 发表于 2016-11-23 19:18
linux64就是这样,long变成了64位。但win64就不一样,long没变还是32位。微软的说法是方便程序移植 ...

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

wye11083 发表于 2016-11-23 19:27:55

gzfslt 发表于 2016-11-23 16:44
现在的64位系统只是寻址采用64位吧?处理精度好像还是32位的。

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

dr2001 发表于 2016-11-23 19:36:34

https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
64bit下有很多类型模型,不一定哪个系统或者某个系统的配置下支持哪个。

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

redroof 发表于 2016-11-23 21:11:59

wye11083 发表于 2016-11-23 19:26
所以通常要用size_t计算大小和偏移量

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

guzhongqi 发表于 2016-11-23 21:40:59

主要看编译器

Gallen.Zhang 发表于 2016-11-23 21:45:25

这个和编译器有关吧

kebaojun305 发表于 2016-11-24 09:16:42

主要是看编译器的设定

winterw 发表于 2016-11-24 10:07:32

系统环境为:
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版本为:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
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
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)

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

dr2001 发表于 2016-11-24 10:54:16

redroof 发表于 2016-11-23 21:11
对,size_t就是一个跟指针同样长度的无符号整数。在32位系统中是32位,在64位系统中就是64位 ...

Linux X32。。。 。。。

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

flamma 发表于 2016-11-24 11:45:29

所以老老实实的用C99规定的可移植的int32_t这种吧。不管啥系统都不怕。
页: [1]
查看完整版本: 对于64bit的系统来说,long long 和long 是一回事吧