V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
dexterlei
V2EX  ›  问与答

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

  •  
  •   dexterlei · May 30, 2016 · 3267 views
    This topic created in 3630 days ago, the information mentioned may be changed or developed.

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

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

    另外 osx 里编译器已经是 clang 了, gcc 只是 clang 的别名
    dexterlei
        5
    dexterlei  
    OP
       May 30, 2016   ❤️ 1
    @UnisandK 看来是我错了,我也试了下,确实也是 8 ,那么,看来是我的移位操作存在问题了,我是用该命令做移位操作的:
    unsigned long long int result = 0;
    result |= 1 << 32;
    将 result 的第 32 位赋值为 1 ,但是这样就会报错了。
    dexterlei
        6
    dexterlei  
    OP
       May 30, 2016   ❤️ 1
    @skydiver 我试了一下 sizeof ,是 8 ,不知是不是我的移位操作写的不对?
    dexterlei
        7
    dexterlei  
    OP
       May 30, 2016   ❤️ 1
    @skydiver 另外, osx 中, clang 做编译, gcc 只是别名的事也是第一次知道,多谢
    UnisandK
        8
    UnisandK  
       May 30, 2016   ❤️ 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  
       May 30, 2016   ❤️ 1
    (uint64_t) 1<<32
    skydiver
        10
    skydiver  
       May 30, 2016   ❤️ 2
    @dexterlei 1 默认是 int ,左移 32 位当然溢出了,正确写法应该写 1ll << 32
    skydiver
        11
    skydiver  
       May 30, 2016   ❤️ 1
    @skydiver 不对,应该是 1ull
    dexterlei
        12
    dexterlei  
    OP
       May 30, 2016   ❤️ 1
    @UnisandK thanks a lot, perfectly solved my problem.
    dexterlei
        13
    dexterlei  
    OP
       May 30, 2016   ❤️ 1
    thank you all very much
    @fcicq
    @skydiver
    @UnisandK
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3398 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 12:09 · PVG 20:09 · LAX 05:09 · JFK 08:09
    ♥ Do have faith in what you're doing.