请教: os x64 位中, gcc 4.2.1, c 语言编译 long long int 数据,得到的数字仅 32 位,并非 64 位,如何解决 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dexterlei
V2EX    问与答

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

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

    它是 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     Solana     2695 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:27 PVG 10:27 LAX 19:27 JFK 22:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86