这里说的是加减法,你是想说比较大小吗。
如果你要纠结于语义上的问题,
地址值是绝对值,无所谓有无符号,可以视为逻辑上无符号。
因此没有人说指针变量本身 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 FROM 139.226.154.*
FROM 139.226.154.*