萌新求问,为什么负数加上2147483647 + 1后算二进制得出的数刚好就是负数的补码? 5
packageC1;importjava.util.Scanner;publicclassword01{publicstaticvoidtwo(inti){if(i==0...
package C1;
import java.util.Scanner;
public class word01 {
public static void two(int i){
if (i == 0) {
return;
}
two(i / 2);
System.out.print(i % 2);
}
public static void main (String[] args) throws java.lang.Exception{
Scanner input=new Scanner(System.in);
String num;
System.out.print("请输入一个整数:");
if(input.hasNextInt()){
num=input.next();
int i=Integer.parseInt(num);
if (i > 0) two(i);
if (i == 0) System.out.print(0);
if (i < 0) two(i + 2147483647 + 1);
}else {
System.out.print("输入错误!");
}
}
}
这是我写程序的代码,为什么负数加上2147483647 + 1后算二进制得出的数刚好就是负数的补码?也就是这行代码if (i < 0) two(i + 2147483647 + 1);
搞不懂呀 展开
import java.util.Scanner;
public class word01 {
public static void two(int i){
if (i == 0) {
return;
}
two(i / 2);
System.out.print(i % 2);
}
public static void main (String[] args) throws java.lang.Exception{
Scanner input=new Scanner(System.in);
String num;
System.out.print("请输入一个整数:");
if(input.hasNextInt()){
num=input.next();
int i=Integer.parseInt(num);
if (i > 0) two(i);
if (i == 0) System.out.print(0);
if (i < 0) two(i + 2147483647 + 1);
}else {
System.out.print("输入错误!");
}
}
}
这是我写程序的代码,为什么负数加上2147483647 + 1后算二进制得出的数刚好就是负数的补码?也就是这行代码if (i < 0) two(i + 2147483647 + 1);
搞不懂呀 展开
展开全部
先说结论:
对一个正数加上2147483647 + 1后得到的是这个数的相反数的原码,而不是负数的补码。
对一个负数加上2147483647 + 1后得到的是无意义的数字。
c语言验证如下:
输出值:
2147483642
(结果为原码,由于c语言采用的补码,所以输出的是乱的)
理论论证如下:
将2147483647转换为二进制后:
发现有31个1,再+1后就是1后面31个0.也就是x=10000000000.......0000000(一共有31个0)。
从此猜测出你的变量为32位有符号int类型。其中最高位是符号位。
假设
x=2147483647 + 1
一个32位int加上x后最高位1变成0,0变成1(若有进位,则会发生溢出丢弃)。相当于对最高位(也就是符号位)取反。
也就是取相反数的操作。而且没有补码的操作。
若原始数据为负数,因为负数内存存放的本来就是补码,若仅仅改变符号位,则变成正数,但是正数c语言认为补码就是原码,不会将补码转换为原码,故输出为乱码。
展开全部
其实说简单点,+1的原因就是为了有符号数多出一个数的编码,并且消除了+0与-0的表示。
如果不+1,8bits的编码只能表示-127 ~ 127,而出现+0与-0的编码,即00000000与10000000。
如果+1后,8bits的编码能够表示-128 ~ 127,并且0只有00000000一种表示,而10000000则表示-128。
如果不+1,8bits的编码只能表示-127 ~ 127,而出现+0与-0的编码,即00000000与10000000。
如果+1后,8bits的编码能够表示-128 ~ 127,并且0只有00000000一种表示,而10000000则表示-128。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
2147483647加上1好像是0x80000000吧 这正好是负数的符号位 效果类似于tWo(-i)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询