请教: os x64 位中, gcc 4.2.1, c 语言编译 long long int 数据,得到的数字仅 32 位,并非 64 位,如何解决

2016-05-30 12:29:29 +08:00
 dexterlei

它是 Xcode 附带安装的 gcc ,我现在需要定义出 64 位的长整型,但使用 long long int 定义出的变量,编译运行后发现,仅为 32 位。

我的编译方式很简单,就是在命令行中输入 gcc - o output.e input.c ,因为文件本身很简单,并不需要链接外部的库。

问题:

  1. 是否我可以在编译命令中,加入某种设置,来实现 long long int 定义 64 位?
  2. 或者这说明这个 gcc 不支持 64 位,需要安装新的更高版本的 gcc 来解决,如何查看?
  3. 没有在 xcode 中找到升级 gcc 的选项,若下载源码安装,如何保证覆盖原 gcc ,同时,覆盖后, xcode 功能是否受影响?

最后,附上 gcc - v 的结果: Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 7.3.0 (clang-703.0.31) Target: x86_64-apple-darwin15.5.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

2713 次点击
所在节点    问与答
13 条回复
yksoft1
2016-05-30 13:21:51 +08:00
x86-64 的 64 位指的是指针长度 64 位。
long long 就算在 32 位系统下也应当是 64 位的。
而且 xcode 现在的版本应该不自带 gcc 了吧
UnisandK
2016-05-30 13:38:33 +08:00
gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
dexterlei
2016-05-30 13:38:58 +08:00
@yksoft1 它确实带了 gcc ,我并没有自行安装过 gcc ,完全是安了 xcode 之后,发现附带了它,而且, gcc 的安装位置:--prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 ,也是在 Xcode 之下。
另外,我是通过对定义的数值进行移位操作,发现它似乎只有 32 位,因为超过这个限度,就会报错了。
至于,为什么 long long int 会定义出 32 位的数值,我也很迷茫,我尽己所能地推测,觉得 gcc 也许最可能是出问题的节点
skydiver
2016-05-30 13:40:35 +08:00
@dexterlei 你怎么知道 long long int 是 32 位的? sizeof 是什么?

另外 osx 里编译器已经是 clang 了, gcc 只是 clang 的别名
dexterlei
2016-05-30 13:47:25 +08:00
@UnisandK 看来是我错了,我也试了下,确实也是 8 ,那么,看来是我的移位操作存在问题了,我是用该命令做移位操作的:
unsigned long long int result = 0;
result |= 1 << 32;
将 result 的第 32 位赋值为 1 ,但是这样就会报错了。
dexterlei
2016-05-30 13:48:02 +08:00
@skydiver 我试了一下 sizeof ,是 8 ,不知是不是我的移位操作写的不对?
dexterlei
2016-05-30 13:51:33 +08:00
@skydiver 另外, osx 中, clang 做编译, gcc 只是别名的事也是第一次知道,多谢
UnisandK
2016-05-30 14:04:24 +08:00
@dexterlei 你说的错误是

warning: shift count >= width of type [-Wshift-count-overflow]
result |= 1 << 32;
^ ~~
1 warning generated.

这个?

看看这儿
http://stackoverflow.com/questions/4201301/warning-left-shift-count-width-of-type
fcicq
2016-05-30 14:05:52 +08:00
(uint64_t) 1<<32
skydiver
2016-05-30 14:08:44 +08:00
@dexterlei 1 默认是 int ,左移 32 位当然溢出了,正确写法应该写 1ll << 32
skydiver
2016-05-30 14:09:22 +08:00
@skydiver 不对,应该是 1ull
dexterlei
2016-05-30 14:12:28 +08:00
@UnisandK thanks a lot, perfectly solved my problem.
dexterlei
2016-05-30 14:13:04 +08:00
thank you all very much
@fcicq
@skydiver
@UnisandK

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/282197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX