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

问大家一个 c++ vector 的问题

  •  
  •   liqingcan · 2016-05-23 23:32:23 +08:00 · 1650 次点击
    这是一个创建于 3124 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如图, nums 是一个 vector 的容器,它里面只有一个值,也就是说他的 size 是 1 ;那么问题来了,为什么把他减到负数,他就变成一堆乱的数字了?求解

    15 条回复    2016-05-24 21:57:50 +08:00
    messyidea
        1
    messyidea  
       2016-05-23 23:39:58 +08:00
    num.size() 是一个 unsigned int
    hxndg
        2
    hxndg  
       2016-05-23 23:47:31 +08:00
    @messyidea 实际上我看这个问题的时候第一反应也是 unsigned int ,转换的问题了,但是问题是为什么数字这么大呢?实际上-1 转成 unsigned int 时输出的是 4294967295 ;复现 lz 程序发现我这里输出也是他那个 18 几几几
    liqingcan
        3
    liqingcan  
    OP
       2016-05-23 23:49:23 +08:00
    @messyidea 哦原来如此
    @hxndg 写程序的时候从来没用过 unsigned 的类型,没想到原因出在这,我郁闷了一晚上
    hxndg
        4
    hxndg  
       2016-05-23 23:50:58 +08:00
    @liqingcan 很正常的, unsigned int 和 signed 运算出问题是一个非常经典的问题。
    choury
        5
    choury  
       2016-05-23 23:53:27 +08:00 via Android
    @hxndg 这是应该 64 位的系统
    messyidea
        6
    messyidea  
       2016-05-23 23:54:32 +08:00
    @hxndg 不太清楚,我随便弄了一个 size 为 1 的数组,在 linux , g++上编译是 4294967295 ,编译器不同可能也有关系。也许 vc++为了提醒用户所以返回了乱码。
    messyidea
        7
    messyidea  
       2016-05-23 23:55:56 +08:00
    @choury 原来如此,没注意到这个问题,我测试的那台 linux 是 32 位的
    hxndg
        8
    hxndg  
       2016-05-23 23:57:34 +08:00
    @choury
    @messyidea
    啊啊啊,我晕了,的确是 64 位的问题,我也是 linux g++,-m32,和-m64 两个的输出就是对应那两个数字。
    publicID002
        9
    publicID002  
       2016-05-23 23:59:20 +08:00 via Android
    @messyidea 是 std::size_t ,具体是什么类型由编译器决定,只是可能是 unsigned int
    messyidea
        10
    messyidea  
       2016-05-24 00:07:47 +08:00
    @publicID002 恩。谢提醒。还没对 STL 深究过(
    htfy96
        11
    htfy96  
       2016-05-24 00:10:58 +08:00 via Android
    @publicID002 是 typename vector<int>::size_type 。。。
    hxndg
        12
    hxndg  
       2016-05-24 00:24:57 +08:00
    @publicID002 万分感谢 stl 深入剖析都是供着。。。没看过。。。
    ryd994
        13
    ryd994  
       2016-05-24 09:35:21 +08:00
    因为 size_t 一般是 unsigned long
    soli
        14
    soli  
       2016-05-24 10:26:30 +08:00
    这不是一个 C++ 的问题。是个 C 的问题。
    publicID002
        15
    publicID002  
       2016-05-24 21:57:50 +08:00
    @htfy96 感谢指正。本来我看几年前的资料还说两个一定相同,今天去查标准就找不到相关的规定了,看来不知道什么时候改过了 orz...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5516 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.