负数问题再次缠绕着我!

yiruirui0507 2010-08-03 11:46:35
int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d",strlen(a));
return 0;
}

废话不多说了,高手看看吧!给分析分析!
...全文
176 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 erorr 的回复:]
strlen遇到\0就认为结束了,\0二进制就是0
-128之后就截断了,-129 = 127,-130 = 126,然后到-256正好是0
[/Quote]

请问这里能分析详细点吗?我就是想知道为什么 -129 = 127,-130 = 126;
自己是这样分析的:-129 129表示形式 1 0000 00001 高位舍去 0000 00001
然后取反 1111 1110 加1 1111 1111 所以-129在内存中的表示形式:1111 1111
0xff 这那里是0x7f(127)啊,明显是个负数,而且是-1 ,我那里分析错了?指点ING......
xuxian02092213 2010-08-03
  • 打赏
  • 举报
回复
strlen返回字符串长度是以\0为结束符的,char到了255就是0x0ff,再往上就是0了,重头开始,那么长度就到此为止。你可以将char a[1000]换成int 或者是long
小楫轻舟 2010-08-03
  • 打赏
  • 举报
回复
楼主可以断点调试啊
a[127] = -128 二进制是 10000000
a[128] = 127 二进制是 01111111
Erorr 2010-08-03
  • 打赏
  • 举报
回复
strlen遇到\0就认为结束了,\0二进制就是0
-128之后就截断了,-129 = 127,-130 = 126,然后到-256正好是0
zecard_fu 2010-08-03
  • 打赏
  • 举报
回复
因为-1-255 取最后两位等于0了唄!

printf("%d\n", (-1-255)&0xff);

运行上面就知道了!
ayw215 2010-08-03
  • 打赏
  • 举报
回复
i从0 到1000
如果a[i]越界,会截取低8位给a[i]
「已注销」 2010-08-03
  • 打赏
  • 举报
回复
char型在接受int型数值的时候最多只支持256位,即-128~127(无符号型则是0~255)
结果应该是256
Learn-anything 2010-08-03
  • 打赏
  • 举报
回复
strlen得到的是字符串的长度,如果其中0的字符,他就认为字符串结束
你的赋值中道255时的值为0,所以是255长度
yiruirui0507 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lightboat09 的回复:]
a[255] = '\0'
[/Quote]

我也知道a[255]=0啊,问题是当i=-129的时候情况是则么样呢?会发生越界,这个时候数据又如何表示呢?
给详细一点,最鄙视故做潇洒装B的人了!希望你不是!
ayw215 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lightboat09 的回复:]

a[255] = '\0'
[/Quote]
所以字符串长度为255
小楫轻舟 2010-08-03
  • 打赏
  • 举报
回复
a[255] = '\0'
yiruirui0507 2010-08-03
  • 打赏
  • 举报
回复
哦,原来高位舍去之后,还是以新的高位为符号位啊,晓得了!
fancanqin 2010-08-03
  • 打赏
  • 举报
回复
学习。。。。
zxk860611 2010-08-03
  • 打赏
  • 举报
回复
:-129 129表示形式 1 0000 00001 高位舍去 0000 00001是因为它只有8位

这时,最高位,也就是左边第一个0仍然被认为是符号位,所以取反0111 1110 加1 0111 1111,即127



[Quote=引用 11 楼 yiruirui0507 的回复:]
引用 8 楼 erorr 的回复:
strlen遇到\0就认为结束了,\0二进制就是0
-128之后就截断了,-129 = 127,-130 = 126,然后到-256正好是0


请问这里能分析详细点吗?我就是想知道为什么 -129 = 127,-130 = 126;
自己是这样分析的:-129 129表示形式 1 0000 00001 begin_of_the_skype_high……
[/Quote]
小楫轻舟 2010-08-03
  • 打赏
  • 举报
回复
写错了,
按16位算的话,
-129 的补码是 1111 1111 0111 1111
小楫轻舟 2010-08-03
  • 打赏
  • 举报
回复
按16位算的话,
-129 的补码是 1111 1111
截位后是 0111 1111 = 127


负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
注意不是先加1后取反

http://blog.csai.cn/user1/14480/archives/2006/3741.html

69,371

社区成员

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

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