我想说的是:
usigned x = -1; // 这个没问题。
signed y = x; // 这个就可以挂了。
【 在 hoodlum (hoodlum) 的大作中提到: 】
: 标 题: Re: c++的数据组下标到底是有符号还是无符号的
: 发信站: 水木社区 (Sat Jan 18 19:54:40 2020), 站内
:
:
: 这里说的是加减法,你是想说比较大小吗。
: 如果你要纠结于语义上的问题,
: 地址值是绝对值,无所谓有无符号,可以视为逻辑上无符号。
: 因此没有人说指针变量本身 hold 的东西是有符号或者无符号的。
: 指针+整数,这里的整数语义上是有符号的,即指针可以在一段地址区间内
: 左右双向移动。
: 说的再直白点,就是说指针在和整数运算时可以视为有符号数运算,
: 在表达地址值时,这个值可以视为无符号数。
:
: 这里注意一点就是,
: 指针 p2 = p1 + (-1);
: 必须满足 p2 < p1 为 true。你可以自己把指针和整数当做有符号或者无符号数,
: 从语义上和实现层面去验证这一点。如果你说都是无符号的,那么语义上就
: 不应该利用底层的溢出来满足上面的条件。
: 因此语义上上面的语法就是向左移动。
:
: 所以,请看清楚下面的我的观点:
: 地址值是可以比较大小的(这里可以视为无符号数比较),
: 一个地址值+一个整数(-1)以后,比之前的值小了。
: (这里相当于 unsigned + signed, 结果依然可视为 unsigned,
: 底层上实际上没有区分)。
: (unsigned > signed, 比较时有任何一个为 unsigned,
: 底层上即等价于 unsigned 比 unsigned,但程序员很容易误以为
: 是 signed 比 signed,因此在编译器里会引发一个警告)。
: 例如
: x1 = -1;
: x2 = x1 >> 1;
: x3 = c + x1;
: 这里 x1 是有符号和无符号,对应的指令是不同的。导致 x2 的值也会不同。
: 但 x1 是有符号和无符号对 x3 的值没有影响。
:
:
: signed 与否主要是 最高位被赋予的逻辑意义不同。
: 所以在加减时不敏感,但比较时,以及不同大小的数据类型之间
: 赋值,位移动等操作时需要注意。
:
: 那么这里的整数(-1)是否有符号的,就不重要。
: 至于语义(就是你逻辑上怎么看待这件事),
: 既然能写 -1,语义上当然它是有符号了。
:
:
: 【 在 here080 (hero080) 的大作中提到: 】
: : signed to unsigned是有定义的。
: : unsigned to signed就可能发生别的事情。
: : 你不要误导小朋友。
: : ...................
:
: --
:
: ※ 修改:·hoodlum 于 Jan 18 20:47:38 2020 修改本文·[FROM: 139.226.154.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 139.226.154.*]
--
修改:hoodlum FROM 139.226.154.*
FROM 76.126.252.*