变量在计算机中以补码方式储存,那如果两个负数想加的时候符号位动吗
变量在计算机中以补码形式储存,那如果两个负数想加的时候符号位动吗?
char a[1000];
int i;
for(i = 0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d\n", strlen(a));//这个打印出来是255
两个补码形式存储的数相加时,如果最高位(符号位)有进位时则进位被省略,那如果两个负数相加得到的是正数吗?计算机的运算规则是什么?求大侠指点
------解决方案--------------------
实际上是因为你的i为255时a[i]=0,而strlen实际上是统计到字符0结束,所以长度为255。
------解决方案--------------------
计算机运算是以补码的形式进行,两个负数相加时,符号位不变,如果溢出的话,有些会报错,有些自动取余下的数。
------解决方案--------------------
当然不动。
------解决方案--------------------
------解决方案--------------------
打印出来是255的主要原因是 数据溢出,你的 i 是 int, 运算是发生了 整型提升
------解决方案--------------------
《深入理解计算机系统》第42页
char a[1000];
int i;
for(i = 0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d\n", strlen(a));//这个打印出来是255
两个补码形式存储的数相加时,如果最高位(符号位)有进位时则进位被省略,那如果两个负数相加得到的是正数吗?计算机的运算规则是什么?求大侠指点
------解决方案--------------------
实际上是因为你的i为255时a[i]=0,而strlen实际上是统计到字符0结束,所以长度为255。
------解决方案--------------------
计算机运算是以补码的形式进行,两个负数相加时,符号位不变,如果溢出的话,有些会报错,有些自动取余下的数。
------解决方案--------------------
当然不动。
------解决方案--------------------
------解决方案--------------------
打印出来是255的主要原因是 数据溢出,你的 i 是 int, 运算是发生了 整型提升
------解决方案--------------------
《深入理解计算机系统》第42页
- C/C++ code
C语言标准并没有要求用补码形式来表示有符号整数,但是几乎所有机器都是这么做的