- 主题:c++的数据组下标到底是有符号还是无符号的
a[-1] 是 访问a[2^32 -1]?
总结一下:就是最终地址肯定是无符号的
-1就是1111…1(个数和寻址长度有关)
如果当成无符号的
1111…1 + 1 溢出结果等于0,背离了原来的语义
如果当成有符号的
1111…1 + 1 没有溢出,结果等于0,没有违背原有语义
所以如果下标本来就设计成有符号的编译器怎么解释都没有错,无符号的就有问题了
--
修改:telangpujing FROM 106.121.139.*
FROM 115.34.136.*
(size_t)-1
【 在 telangpujing () 的大作中提到: 】
: a[-1] 是 访问a[2^32 -1]?
--
FROM 124.217.188.*
你不能自己先试一下?
【 在 telangpujing (telangpujing) 的大作中提到: 】
: 标 题: c++的数据组下标到底是有符号还是无符号的
: 发信站: 水木社区 (Wed Jan 15 12:03:57 2020), 站内
:
: a[-1] 是 访问a[2^32 -1]?
: --
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 115.34.136.*]
--
FROM 27.115.74.*
其实这两者没什么区别,size_t是个和指针长度等长的类型(不知道有没有哪个编译器不是这样的),于是(2^XLEN)加上去之后最后地址溢出也会做截断操作。
不过C++的[]是可以重载的,这个时候的下标索引可能会产生不同的含义。
【 在 telangpujing (telangpujing) 的大作中提到: 】
: a[-1] 是 访问a[2^32 -1]?
--
修改:ArchLinux FROM 103.254.68.*
FROM 103.254.68.*
有符号的。
a[-1] 就是 *(a - 1)
【 在 telangpujing (telangpujing) 的大作中提到: 】
: a[-1] 是 访问a[2^32 -1]?
--
FROM 139.226.154.*
std::array::operator[]就没有符号。
我认为不管a[-1]是否能用,我们都应该当成UB不要用。
【 在 hoodlum (hoodlum) 的大作中提到: 】
: 标 题: Re: c++的数据组下标到底是有符号还是无符号的
: 发信站: 水木社区 (Thu Jan 16 02:19:03 2020), 站内
:
:
: 有符号的。
:
: a[-1] 就是 *(a - 1)
:
:
: 【 在 telangpujing (telangpujing) 的大作中提到: 】
: : a[-1] 是 访问a[2^32 -1]?
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 139.226.154.*]
--
FROM 76.126.252.*
c++ 里指针肯定是要双向均可移动的。不可能给自己设置障碍。
检查边界那是其他语言里面的哲学。c++ 为了效率在裸指针里这些都不要。
【 在 here080 (hero080) 的大作中提到: 】
: std::array::operator[]就没有符号。
: 我认为不管a[-1]是否能用,我们都应该当成UB不要用。
--
FROM 139.226.154.*
不用负的指标就影响效率了?
*(a - 3)比a[-3]效率低吗?
【 在 hoodlum (hoodlum) 的大作中提到: 】
: 标 题: Re: c++的数据组下标到底是有符号还是无符号的
: 发信站: 水木社区 (Fri Jan 17 01:59:01 2020), 站内
:
:
: c++ 里指针肯定是要双向均可移动的。不可能给自己设置障碍。
指针当然可以减,但是为什么要用负指标?
: 检查边界那是其他语言里面的哲学。c++ 为了效率在裸指针里这些都不要。
:
: 【 在 here080 (hero080) 的大作中提到: 】
: : std::array::operator[]就没有符号。
: : 我认为不管a[-1]是否能用,我们都应该当成UB不要用。
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 139.226.154.*]
--
FROM 76.126.252.*
eh,... 对指针来说,这两个底层上一模一样啊。
对用户类型对象来说,[] 是一个 operator,取决于用户的定义。
【 在 here080 (hero080) 的大作中提到: 】
: 不用负的指标就影响效率了?
: *(a - 3)比a[-3]效率低吗?
: 指针当然可以减,但是为什么要用负指标?
: ...................
--
修改:hoodlum FROM 139.226.154.*
FROM 139.226.154.*
除非有特别需求,否则正常来说应该只用非负指标。
特别需求是指自定义一些特别的类,比如:
双向扩展式容器
循环式容器
【 在 hoodlum (hoodlum) 的大作中提到: 】
: 标 题: Re: c++的数据组下标到底是有符号还是无符号的
: 发信站: 水木社区 (Fri Jan 17 03:20:28 2020), 站内
:
:
: eh,... 对指针来说,这两个底层上一模一样啊。
: 对用户类型对象来说,[] 是一个 operator,取决于用户的定义。
:
:
: 【 在 here080 (hero080) 的大作中提到: 】
: : 不用负的指标就影响效率了?
: : *(a - 3)比a[-3]效率低吗?
: : 指针当然可以减,但是为什么要用负指标?
: : ...................
:
: --
:
: ※ 修改:·hoodlum 于 Jan 17 03:21:36 2020 修改本文·[FROM: 139.226.154.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 139.226.154.*]
--
修改:hoodlum FROM 139.226.154.*
FROM 76.126.252.*