V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dexterlei
V2EX  ›  问与答

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

  •  
  •   dexterlei · 2016-05-30 12:29:29 +08:00 · 2532 次点击
    这是一个创建于 2878 天前的主题,其中的信息可能已经有所发展或是发生改变。

    它是 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

    第 1 条附言  ·  2016-05-30 13:57:54 +08:00
    经下面几位的提点,我用 sizeof 验证了一下,发现确实是 64 位才对,那么,应该是我的移位操作有问题,或者是我对移位操作的理解不准确?
    unsigned long long int result = 0;
    result |= 1 << n;// 将 result 的指定第 n 位赋值为 1 ,
    运行的过程中,当 n>=31 的时候,数字就会出问题,故而我当时就认为是 result 的长度不对
    第 2 条附言  ·  2016-05-30 14:16:48 +08:00
    问题已解决,谢谢大家
    总结:
    1.确实是我对移位操作的理解不够深入仔细,移位时,被移动的数值竟然没有考虑到;
    2.系统和编译器并不存在问题, long long int 的确是定义出了 64 位的值
    谢谢大家
    13 条回复    2016-05-30 14:13:04 +08:00
    yksoft1
        1
    yksoft1  
       2016-05-30 13:21:51 +08:00   ❤️ 1
    x86-64 的 64 位指的是指针长度 64 位。
    long long 就算在 32 位系统下也应当是 64 位的。
    而且 xcode 现在的版本应该不自带 gcc 了吧
    UnisandK
        2
    UnisandK  
       2016-05-30 13:38:33 +08:00   ❤️ 1
    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
        3
    dexterlei  
    OP
       2016-05-30 13:38:58 +08:00   ❤️ 1
    @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
        4
    skydiver  
       2016-05-30 13:40:35 +08:00   ❤️ 1
    @dexterlei 你怎么知道 long long int 是 32 位的? sizeof 是什么?

    另外 osx 里编译器已经是 clang 了, gcc 只是 clang 的别名
    dexterlei
        5
    dexterlei  
    OP
       2016-05-30 13:47:25 +08:00   ❤️ 1
    @UnisandK 看来是我错了,我也试了下,确实也是 8 ,那么,看来是我的移位操作存在问题了,我是用该命令做移位操作的:
    unsigned long long int result = 0;
    result |= 1 << 32;
    将 result 的第 32 位赋值为 1 ,但是这样就会报错了。
    dexterlei
        6
    dexterlei  
    OP
       2016-05-30 13:48:02 +08:00   ❤️ 1
    @skydiver 我试了一下 sizeof ,是 8 ,不知是不是我的移位操作写的不对?
    dexterlei
        7
    dexterlei  
    OP
       2016-05-30 13:51:33 +08:00   ❤️ 1
    @skydiver 另外, osx 中, clang 做编译, gcc 只是别名的事也是第一次知道,多谢
    UnisandK
        8
    UnisandK  
       2016-05-30 14:04:24 +08:00   ❤️ 2
    @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
        9
    fcicq  
       2016-05-30 14:05:52 +08:00   ❤️ 1
    (uint64_t) 1<<32
    skydiver
        10
    skydiver  
       2016-05-30 14:08:44 +08:00   ❤️ 2
    @dexterlei 1 默认是 int ,左移 32 位当然溢出了,正确写法应该写 1ll << 32
    skydiver
        11
    skydiver  
       2016-05-30 14:09:22 +08:00   ❤️ 1
    @skydiver 不对,应该是 1ull
    dexterlei
        12
    dexterlei  
    OP
       2016-05-30 14:12:28 +08:00   ❤️ 1
    @UnisandK thanks a lot, perfectly solved my problem.
    dexterlei
        13
    dexterlei  
    OP
       2016-05-30 14:13:04 +08:00   ❤️ 1
    thank you all very much
    @fcicq
    @skydiver
    @UnisandK
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3690 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:41 · PVG 12:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.