符号位问题

Wijor 2009-08-02 01:03:24
main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
a[i]=-1-i;
printf("%d",strlen(a));
}
输出结果是255

会的朋友指教下,越详细越好....
...全文
429 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanght99 2009-08-02
  • 打赏
  • 举报
回复
负数原码计算好像-128的情况覆盖不到啊?
wanght99 2009-08-02
  • 打赏
  • 举报
回复
我也发现了,呵呵。
这下我想大家都明白了。

[Quote=引用 52 楼 mstlq 的回复:]
引用 50 楼 wanght99 的回复:
符号位不需要特殊考虑啊,只要把取反加1在位数上操作就可以了。
符号位就是原正数最高位的0取反得来的。
如果照这么做出来符号位是0,说明这个数溢出了,不能用该长度的补码表示。




呵呵,我是说在负数原码的基础上取反^_^
负数原码最高位就是1,取反就变0了^_^


呵呵,反正大家都知道是那么回事,了解原理就行了^_^

[/Quote]
wanght99 2009-08-02
  • 打赏
  • 举报
回复
这两种是等价的,我50楼说的就是这种情况。。

[Quote=引用 51 楼 wijor 的回复:]
引用 49 楼 mstlq 的回复:
引用 46 楼 wijor 的回复:
引用 44 楼 mstlq 的回复:
唉,楼主是被你的课本误导了╮(╯_╰)╭


呵呵,讨论了这么久,没精力了....不过我敢肯定的告诉你,是那样没错的,你也可以网上查查....
不管怎么说,谢谢了...


网上查到的就是负数原码取反(保持符号位不变)加1
括号里面的东西如果没了,会挂的……



晕死,你看我12楼的回复,我早就说了,负数取反时符号位不变,打字的时候漏了,这地球人都该知道的...
刚指出你的概念错误是因为你39楼的回复,你说,补码=对应正数原码 取反 +1,没想到还有另一种说法...呵呵,当然,这种说法好象也对....

[/Quote]
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 wanght99 的回复:]
符号位不需要特殊考虑啊,只要把取反加1在位数上操作就可以了。
符号位就是原正数最高位的0取反得来的。
如果照这么做出来符号位是0,说明这个数溢出了,不能用该长度的补码表示。

[/Quote]


呵呵,我是说在负数原码的基础上取反^_^
负数原码最高位就是1,取反就变0了^_^



呵呵,反正大家都知道是那么回事,了解原理就行了^_^
Wijor 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 mstlq 的回复:]
引用 46 楼 wijor 的回复:
引用 44 楼 mstlq 的回复:
唉,楼主是被你的课本误导了╮(╯_╰)╭


呵呵,讨论了这么久,没精力了....不过我敢肯定的告诉你,是那样没错的,你也可以网上查查....
不管怎么说,谢谢了...


网上查到的就是负数原码取反(保持符号位不变)加1
括号里面的东西如果没了,会挂的……
[/Quote]


晕死,你看我12楼的回复,我早就说了,负数取反时符号位不变,打字的时候漏了,这地球人都该知道的...
刚指出你的概念错误是因为你39楼的回复,你说,补码=对应正数原码 取反 +1,没想到还有另一种说法...呵呵,当然,这种说法好象也对....
wanght99 2009-08-02
  • 打赏
  • 举报
回复
符号位不需要特殊考虑啊,只要把取反加1在位数上操作就可以了。
符号位就是原正数最高位的0取反得来的。
如果照这么做出来符号位是0,说明这个数溢出了,不能用该长度的补码表示。

[Quote=引用 49 楼 mstlq 的回复:]
引用 46 楼 wijor 的回复:
引用 44 楼 mstlq 的回复:
唉,楼主是被你的课本误导了╮(╯_╰)╭


呵呵,讨论了这么久,没精力了....不过我敢肯定的告诉你,是那样没错的,你也可以网上查查....
不管怎么说,谢谢了...


网上查到的就是负数原码取反(保持符号位不变)加1
括号里面的东西如果没了,会挂的……
[/Quote]
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 wijor 的回复:]
引用 44 楼 mstlq 的回复:
唉,楼主是被你的课本误导了╮(╯_╰)╭


呵呵,讨论了这么久,没精力了....不过我敢肯定的告诉你,是那样没错的,你也可以网上查查....
不管怎么说,谢谢了...
[/Quote]

网上查到的就是负数原码取反(保持符号位不变)加1
括号里面的东西如果没了,会挂的……
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 wijor 的回复:]
唉....楼上的,真不知道该怎么说,害我特意去翻书,我就说嘛,你好象概念都错了,负数的补码是该负数原码取反加1,正数三码相同....不过,还是非常感谢啊....
[/Quote]

按你书上的说法,会很强大地将-1的补码算作0111 1111^_^,珍惜生命,远离国产教材+_+
wanght99 2009-08-02
  • 打赏
  • 举报
回复
网上交流容易因为对文字的不同理解产生误解,39楼不是自己没搞明白,只是陈述上让你误解了。

不管怎么说,弄明白就好,呵呵。

[Quote=引用 42 楼 wijor 的回复:]
....刚回复是对39楼说的....
[/Quote]
Wijor 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 mstlq 的回复:]
唉,楼主是被你的课本误导了╮(╯_╰)╭
[/Quote]

呵呵,讨论了这么久,没精力了....不过我敢肯定的告诉你,是那样没错的,你也可以网上查查....
不管怎么说,谢谢了...
Wijor 2009-08-02
  • 打赏
  • 举报
回复
唉....大体算是弄明白了....非常感谢大家!!!
结帖了...
mstlq 2009-08-02
  • 打赏
  • 举报
回复
唉,楼主是被你的课本误导了╮(╯_╰)╭
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 wijor 的回复:]
唉....楼上的,真不知道该怎么说,害我特意去翻书,我就说嘛,你好象概念都错了,负数的补码是该负数原码取反加1,正数三码相同....不过,还是非常感谢啊....
[/Quote]

那是两套表述……
如果用你书上的概念,那么负数计算方法就不是该负数原码取反加1,而是原码符号位不变,其余各位取反,然后加1……
Wijor 2009-08-02
  • 打赏
  • 举报
回复
....刚回复是对39楼说的....
Wijor 2009-08-02
  • 打赏
  • 举报
回复
唉....楼上的,真不知道该怎么说,害我特意去翻书,我就说嘛,你好象概念都错了,负数的补码是该负数原码取反加1,正数三码相同....不过,还是非常感谢啊....
wanght99 2009-08-02
  • 打赏
  • 举报
回复
是的,1......1 10000000是整型长度的补码
10000000是8位的补码。
它们都是-128 这也是二进制被码的特点,把符号位扩展出去不改变补码的值。

截断的时候,原来的符号位丢了,原来不是符号位的变成了符号位。希望能对你理解有帮助。

[Quote=引用 38 楼 wijor 的回复:]
引用 36 楼 mstlq 的回复:
i=127 时
内存 1000 0000  值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

i=128时
内存 0111 01111 值 127  从等式右边的int -129(1111 1111 1111 1111 1111 1111 0111 1111截断而来)





你这....
内存 1000 0000  值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

1111 1111 1111 1111 1111 1111 1000 0000是补码吗?
[/Quote]
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 wijor 的回复:]
引用 36 楼 mstlq 的回复:
i=127 时
内存 1000 0000  值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

i=128时
内存 0111 01111 值 127  从等式右边的int -129(1111 1111 1111 1111 1111 1111 0111 1111截断而来)





你这....
内存 1000 0000  值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

1111 1111 1111 1111 1111 1111 1000 0000是补码吗?
[/Quote]

当然是补码……
补给你看……

补码=对应正数原码 取反 +1

-128对应正数:128
128原码:
0000 0000 0000 0000 0000 0000 1000 0000
取反得:
1111 1111 1111 1111 1111 1111 0111 1111
再加1就得-128补码:
1111 1111 1111 1111 1111 1111 1000 0000

收工╮(╯_╰)╭
Wijor 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 mstlq 的回复:]
i=127 时
内存 1000 0000  值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

i=128时
内存 0111 01111 值 127  从等式右边的int -129(1111 1111 1111 1111 1111 1111 0111 1111截断而来)


[/Quote]


你这....
内存 1000 0000 值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

1111 1111 1111 1111 1111 1111 1000 0000是补码吗?
wanght99 2009-08-02
  • 打赏
  • 举报
回复
i = 127的时候,内存中是1......1 10000000的后8位
i = 128的时候,内存中是1......1 01111111的后8位

想成无符号数,这里就是128->127的关系
想成有符号数,这里就是-128->127的关系。

任何时候都有截断,只是这个特殊的位置,截断之后,符号位发生了变化。

[Quote=引用 32 楼 wijor 的回复:]
唉,你说的那些我都懂啊,关键就是i等于127的时候内存怎么表示,和从i等于127增加到128时内存发生的变化.....
[/Quote]
mstlq 2009-08-02
  • 打赏
  • 举报
回复
i=127 时
内存 1000 0000 值-128 从等式右边的int -128(1111 1111 1111 1111 1111 1111 1000 0000截断而来)

i=128时
内存 0111 01111 值 127 从等式右边的int -129(1111 1111 1111 1111 1111 1111 0111 1111截断而来)

加载更多回复(35)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧