打印整数(包含负数)在计算机内部的二进制表示

在理解整数的二进制表示之前我们首先要知道以下三个概念:源码、补码和反码。源码就是一个整数的二进制表示,其中最高位为符号位,我们用0表示正数,用1表示负数。如果用8位表示一个整数的话,5的源码我们可以表示为00000101。-6的源码我们可以表示为10000110。反码是将源码符号位(也就是最高位)不变,其他位取反得到的二进制码。补码是将反码反码按位加上二进制数1得到的二进制码。 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

正数补码:和原码相同。负数补码:符号位不动,反码加1

看如下例子:

我们可以用如下代码来验证我们上面的结论:

package test;
/**
 * 在Java中整数占4个字节,也就是32位
 * @author wl
 *
 */
public class PrintIntByBinary {
	public static void main(String[] args) {
		int a1=3;
		System.out.print(a1+"的二进制表示形式为:");
		printBinaryOfInt(a1);

		int a2=-3;
		System.out.print(a2+"的二进制表示形式为:");
		printBinaryOfInt(a2);
	}

	public static void printBinaryOfInt(int num){
		int t=0;
		for(int i=0;i<32;i++){//循环32次,应为int型在Java中占32位
			t=(num&0x80000000>>>i)>>>(31-i);
			/*0x80000000的二进制表示形式为最高位为1其他31位为0,>>>表示
			无符号右移,当i=0时,0x80000000>>>0结果还是0x80000000,
			num&0x80000000,表示取num的最高位,其他位都置0,然后再将结果进行>>>(31-i)
			运算,也就是无符号右移31次,得到最高位,当i=1、2、3.....时依次取出次高位,第29位的
			一直到最低位的值*/
			System.out.print(t);
		}
		System.out.println();
	}
}

输出为:

3的二进制表示形式为:00000000000000000000000000000011

-3的二进制表示形式为:11111111111111111111111111111101

时间: 2024-08-06 08:19:45

打印整数(包含负数)在计算机内部的二进制表示的相关文章

查看数字在计算机内部的二进制表示

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992526.html #include<stdio.h> int main(void){        char c=97;        short s=97;        int n=97;        float f=97;        double d=97; int i,j;        printf("char 97在计算机中的二进制表示:");     

深入了解整数在计算机内部的表示

1. 无符号整数的表示 我们知道,无符号整数在计算机内部是以二进制的形式存储的,比如我们在C语言中声明并初始化一个变量: int i = 66; 假设我们针对的机器是32位机器,byte order为little endian.由于int类型是32位的,66这个数字就会被存储为它的32位二进制表示(01000010 00000000 00000000 00000000),共占据4个存储单元. 这样一来,32位二进制数所能表示的无符号整数共有2^32个,范围为[0, 2^32 - 1].然而,我们

计算机内部整数的表示(二进制存储)

10.在16位机器上跑下列foo函数的结果是(B)(阿里2014笔试题)   void foo()   {       int i = 65536;       cout << i<<”,”;       i = 65535;       cout << i;   }   A.-1,65535   B.0,-1     C.-1,-1    D.0,65535 解析:16位机器的int型变量为16位 16位int的表示范围:-32768到32767 65535(十进制)

【C/C++学院】0725-内存补码分析/补码原码实战/打印整数二进制数据/静态库说明

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 内存补码分析 #include<stdio.h> #include<stdlib.h> void main3() { //printf

负数在计算机中的表示 Byte-128

http://blog.csdn.net/njuitjf/article/details/4585247 今天,老大让我调查一个浮点数转换为整数的问题.自己就查了些资料,顺便复习一下原码.反码和补码. 原码:将一个整数,转换成二进制,就是其原码.如单字节的5的原码为:0000 0101:-5的原码为1000 0101. 反码:正数的反码就是其原码:负数的反码是将原码中,除符号位以外,每一位取反.如单字节的5的反码为:0000 0101:-5的原码为1111 1010. 补码:正数的补码就是其原码

负数在计算机中如何存储

符号位 在8位机中,规定每个字节的最高位为符号位.那么,+8就是00001000,而-8则是10001000. 但是,随便找一本<计算机原理>,都会告诉你,实际上,计算机内部采用2的补码(Two's Complement)表示负数. 计算机处理加法运算逻辑 正数的原码,反码,补码都相同,负数的原码,反码,补码都不同. [x]补码+[y]补码=[x+y]补码,如果结果是正数,正数补码等于原码,如果是负数再转化成原码([x]原码=[[x]补]补) 什么是补码,及计算方法 第一步,每一个二进制位都取

Java打印整数的二进制表示(代码与解析)

Java打印整数的二进制表示(代码与解析) int a=-99; for(int i=0;i<32;i++){ int t=(a & 0x80000000>>>i)>>>(31-i); System.out.print(t); } 拆分一下这段代码,要理解这个移位输出的问题还需要理解的以下内容:* 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000* 运算的优先级,移位运算高于逻辑运算,

【C/C++语言】int 在计算机内部的存储

int在32位计算机中占4个字节,主要是想弄清楚这4个字节的在内存中存放的顺序. 1 #include <iostream> 2 3 using namespace std; 4 5 typedef struct int_char 6 { 7 int a; 8 unsigned char *b; 9 }; 10 11 int main() 12 { 13 int_char A; 14 int i; 15 //test int; 16 A.a=0x01ab02cd; 17 A.b=(unsign

负数在计算机中的存储

负数在计算机中以补码的形式存储,最高位1为负数,0为正数,补码的方式方便进行加法运算. byte类型数值范围-128到127. 最高位是标志位,127二进制为01111111,则-127为10000001,-128=-127-1,所以其二进制为10000000 byte b=11111111;正数表现形式:00000001,即b=-1; 正数取反加1为其负数表现形式,那么负数取反加1会得到起它的正数形式吗? 例:-3=1111 1101 ;取反后为:0000 0010 ; 加1:0000 001