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

2016-05-23 23:32:23 +08:00
 liqingcan

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

1656 次点击
所在节点    问与答
15 条回复
messyidea
2016-05-23 23:39:58 +08:00
num.size() 是一个 unsigned int
hxndg
2016-05-23 23:47:31 +08:00
@messyidea 实际上我看这个问题的时候第一反应也是 unsigned int ,转换的问题了,但是问题是为什么数字这么大呢?实际上-1 转成 unsigned int 时输出的是 4294967295 ;复现 lz 程序发现我这里输出也是他那个 18 几几几
liqingcan
2016-05-23 23:49:23 +08:00
@messyidea 哦原来如此
@hxndg 写程序的时候从来没用过 unsigned 的类型,没想到原因出在这,我郁闷了一晚上
hxndg
2016-05-23 23:50:58 +08:00
@liqingcan 很正常的, unsigned int 和 signed 运算出问题是一个非常经典的问题。
choury
2016-05-23 23:53:27 +08:00
@hxndg 这是应该 64 位的系统
messyidea
2016-05-23 23:54:32 +08:00
@hxndg 不太清楚,我随便弄了一个 size 为 1 的数组,在 linux , g++上编译是 4294967295 ,编译器不同可能也有关系。也许 vc++为了提醒用户所以返回了乱码。
messyidea
2016-05-23 23:55:56 +08:00
@choury 原来如此,没注意到这个问题,我测试的那台 linux 是 32 位的
hxndg
2016-05-23 23:57:34 +08:00
@choury
@messyidea
啊啊啊,我晕了,的确是 64 位的问题,我也是 linux g++,-m32,和-m64 两个的输出就是对应那两个数字。
publicID002
2016-05-23 23:59:20 +08:00
@messyidea 是 std::size_t ,具体是什么类型由编译器决定,只是可能是 unsigned int
messyidea
2016-05-24 00:07:47 +08:00
@publicID002 恩。谢提醒。还没对 STL 深究过(
htfy96
2016-05-24 00:10:58 +08:00
@publicID002 是 typename vector<int>::size_type 。。。
hxndg
2016-05-24 00:24:57 +08:00
@publicID002 万分感谢 stl 深入剖析都是供着。。。没看过。。。
ryd994
2016-05-24 09:35:21 +08:00
因为 size_t 一般是 unsigned long
soli
2016-05-24 10:26:30 +08:00
这不是一个 C++ 的问题。是个 C 的问题。
publicID002
2016-05-24 21:57:50 +08:00
@htfy96 感谢指正。本来我看几年前的资料还说两个一定相同,今天去查标准就找不到相关的规定了,看来不知道什么时候改过了 orz...

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

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

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

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

© 2021 V2EX