Tag: twos complement

如果我输入一个等于INTMax + 1的数字,计算机不会返回-1

int类型的长度是4个字节,我在Ubuntu下用C编写了一个小程序来打印我刚刚输入的数字。 当我输入2147483648,即2 ^ 31时,它打印2147483647而不是-1。 当我输入任何大于2147483647的数字时,会发生同样的事情。为什么它不会溢出到-1,因为我学习了表格书,但似乎被截断为INT_Max并且在比特级别发生了什么? #include int main(){ int x; scanf(“%d”,&x); printf(“%d\n”,x); } 我犯了一个错误。 INT_Max + 1应等于INT_Min。 我修改了代码: #include int main(){ int x=2147483647; int y=x+1; printf(“%d”,y); } 输出是-2147483648现在我只是想知道当我调用函数scanf时发生了什么? 我认为它将所有大于2147483647的输入数字截断为2147483647。

将二进制补码转换为符号幅度

我需要仅使用运算符将​​C的两个补码转换为符号幅度 ! ~ & ^ | + <> 我的方法是找到sign: int sign = !(!(a>>31)); 基本上, if sign == 1 。 我想翻转数字并添加1,否则只想显示数字。 问题是我不能使用任何循环,if语句等。这就是我正在做的事情: int s_M = ((((a+1)>>31)^sign)+1)&sign; 有什么建议?