社区
C语言
帖子详情
符号位问题
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
打赏
收藏
符号位问题
main() { char a[1000]; int i; for(i=0;i<1000;i++) a[i]=-1-i; printf("%d",strlen(a)); } 输出结果是255 会的朋友指教下,越详细越好....
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
关于余数的
符号
位
问题
在研究定点整数、浮点数除法(尤其是加减交替法)时发现一个
问题
——商的
符号
位
可以由被除数和除数的
符号
位
异或来确定,余数的
符号
位
呢? 例如,我们考察 -5/3 和 5/-3。根据机器内部除法的机制,先将
符号
位
异或,...
关于双
符号
位
的溢出
问题
双
符号
位
加减
问题
双
符号
位
表示正数是00,负数是11,因为采用了两
位
符号
位
,肯定多了信息,实际上是可一将第二
位
符号
位
看做原来单
符号
位
表示法里的
符号
位
。 1.单
符号
位
判断溢出 方法:判断
符号
进
位
位
Cs和最高数
位
...
移
位
操作 双
符号
位
有
符号
数的移
位
操作—算术移
位
众所周知 机器数(被数字化的数)为正时 原码 补码 反码 左移右移都补0 ...2、为什么在算术移
位
时 只有高
符号
位
保留不变 而低
符号
位
要参与移
位
例:原码 00.001101 ①乘以2^1 左移
双
符号
位
补码(用于修正单
符号
位
补码+法溢出)
当两
位
符号
位
为 01, 10时就是溢出,这时取最高
位
为
符号
位
,其他
位
为数值
位
*/ #include<bits/stdc++.h> using namespace std; int binary_x[6]; int binary_y[6]; void BaseConversion(int n, int b, ...
Verilog基础知识(有
符号
数运算规则,加减运算,乘法运算中的
符号
位
拓展
问题
)
https://blog.csdn.net/maxwell2ic/article/details/80620991 ...The format of the signed type is two’s complement. 有
符号
数均为补码表示 If any operand in an expression is unsigned...
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章