变量在计算机中以补码形式储存,那如果两个负数想加的时候符号位动吗?

never_give_up 2012-08-09 05:43:09
char a[1000];
int i;
for(i = 0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d\n", strlen(a));//这个打印出来是255


两个补码形式存储的数相加时,如果最高位(符号位)有进位时则进位被省略,那如果两个负数相加得到的是正数吗?计算机的运算规则是什么?求大侠指点
...全文
646 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzamygsd 2012-08-10
  • 打赏
  • 举报
回复
《深入理解计算机系统》第42页

C语言标准并没有要求用补码形式来表示有符号整数,但是几乎所有机器都是这么做的


计算这样正数负数相加相减溢出等的时候,

把数在内存中的存放二进制形式写出来,负数还是以补码的形式写出来

32位如果是int型相加的话,只截取后32位,高位扔掉,
运算结果就看你是以有符号还是无符号去解释了



AnYidan 2012-08-10
  • 打赏
  • 举报
回复
打印出来是255的主要原因是 数据溢出,你的 i 是 int, 运算是发生了 整型提升
Gonefar 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

那就是负数相计算的时候不会算符号位,而负数与负数相间的时候如果符号位有进位的时候符号位为0,还是舍弃了那个进位,要不怎么会出现正数呢
[/Quote]
负数与负数相减,计算机计算时会转成负数与正数相加。计算机计算时都是已加法和移位进行的。
titer1 2012-08-09
  • 打赏
  • 举报
回复
当然不动。

[Quote=引用 2 楼 的回复:]

计算机运算是以补码的形式进行,两个负数相加时,符号位不变,如果溢出的话,有些会报错,有些自动取余下的数。
[/Quote]
never_give_up 2012-08-09
  • 打赏
  • 举报
回复
那就是负数相计算的时候不会算符号位,而负数与负数相间的时候如果符号位有进位的时候符号位为0,还是舍弃了那个进位,要不怎么会出现正数呢
Gonefar 2012-08-09
  • 打赏
  • 举报
回复
计算机运算是以补码的形式进行,两个负数相加时,符号位不变,如果溢出的话,有些会报错,有些自动取余下的数。
图灵狗 2012-08-09
  • 打赏
  • 举报
回复
实际上是因为你的i为255时a[i]=0,而strlen实际上是统计到字符0结束,所以长度为255。

69,391

社区成员

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

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