精华内容
下载资源
问答
  • 1. 在计算机里,通常用数字后面紧跟一个英文字母来表示该数的数字,十进制一般用D,二进制用B,八进制用O,十六进用H来表示,2.首先,十进制数转换成二进制,除2取余,按箭头方向写,自上而下写出来,所以45D转换成...

    1. 在计算机里,通常用数字后面紧跟一个英文字母来表示该数的数字,

    十进制一般用D,二进制用B,八进制用O,十六进用H来表示,

    2.

    首先,十进制数转换成二进制,除2取余,按箭头方向写,自上而下写出来,所以45D转换成二进制为:101101B

    3.

    十进制数转换成十六进除16取余,16进制一般用0~9,A,B,C,D,E,F,所以,117D转换成十六进制为:75H,

    6.2 十六进制

    到二进制:每一位用4位二进制数来表示,最终形成对应的二进制数,如:

    A19CH

    :A=10(十进制)=1010 ,1 = 0001 ,9 = 1001,C = 12(十进制)=1100,

    所以A19CH =

    1010000110011100B

    7.机器数

    通常,机器数是把符号"数字化"的数,是数字在计算机中的二进制表示形式。

    一:

    数的符号数值化。实用的数据有正数和负数,由于计算机内部硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号“+”或负号“-”,在机器里就用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位,称符号位,以0代表符号“+”,以1代表符号“-”。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。例如二进制真值数-011011,它的机器

    1011011。

    二:

    二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),现在机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。

    三:

    机器数可以用不同的码制来表示,常用的有原码,补码,和反码表示法。

    将数的真值形式中“+”号用“0”表示,“-”号用“1”表示时,叫做数的原码形式,简称原码。若字长为n位,原码一般可表示为:

    (1)当X为正数时[X]原和X一样,即[X]原 =

    X。当X为负数时。由于X本身为负数,所以,实际上是将∣X∣数值部分绝对值前面的符号位上写成“1”即可。

    原码表示法比较直观,它的数值部分就是该数的绝对值,而且与真值、十进制数的转换十分方便。但是它的加减法运算较复杂。当两数相加时,机器要首先判断两数的符号是否相同,如果相同则两数相加,若符号不同,则两数相减。在做减法前,还要判断两数绝对值的大小,然后用大数减去小数,最后再确定差的符号,换言之,用这样一种直接的形式进行加运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定和的符号位。要实现这些操作,电路就很复杂,这显然是不经济实用的。为了减少设备,解决机器内负数的符号位参加运算的问题,总是将减法运算变成加法运算,也就引进了反码和补码这两种机器数。

    4.2 反码

    如前所述,为了克服原码运算的缺点,采用机器数的反码和补码表示法。若字长为n位,反码可表示为:

    (2)即对正数来说,其反码和原码的形式相同;对负数来说,反码为其原码的数值部分各位变反。

    4.3 补码

    补码是根据同余的概念引入的,我们来看一个减法通过加法来实现的例子。假定现在是北京时间6点整,有一只手表却是8点整,比北京时间快了2小时,校准的方法有两种,一种是倒拨2小时,一种是正拨10小时。若规定倒拨是做减法,正拨是做加法,那么对手表来讲减2与加10是等价的,也就是说减2可以用加10来实现。这是因为8加10等于18,然而手表最大只能指示12,当大于12时12自然丢失,18减去12就只剩6了。这说明减法在一定条件下,是可以用加法来代替的。这里“12”称为“模”,10称为“-2”对模12的补数。推广到一般则有:

    A – B = A + ( – B + M ) = A + ( – B

    )补

    总之,正数的原码、反码和补码是完全相同的;负数的原码、反码和补码其形式各不相同。另外,特别要注意的是,对于负数的反码和补码(即符号位为1的数),其符号位后边的几位数表示的并不是此数的数值。如果要想知道此数的大小,一定要求其反码或补码才行。

    多数机器里面都是采用补码表示,正数采用符号+绝对值表示,如:假设机器字长为8位,则[+1]补 =

    00000001,[+127]补=01111111,[+0]补=00000000,当用补码表示法表示负数时,负数X用2的n次方-[X]来表示,其中n为机器的字长。如:[-1]补

    = 28-1 = 11111111,[-127]补 =

    28-127=256-127=129=1000001,0的补码就只有一种表示法:八个0,00000000.

    对于10000000这个数,在补码表示法中被定义为-128,采用补码形式表示的有符号数,那么n位二进制数据能够表示的有符号整数的范围是:-2(n-1)~2(n-1)-1

    是n-1次方(我现在能够理解补码了,也能理解这个范围了,我以前好像陷入了一个这种误解,老是以为这个范围,是这样得出的,比如,负数,最高位是1,对于机器字长8位来说,剩余的七位全是1,即1111111,加起来,就是八个11111111,然后,最小的就是8个0,00000000,然后把这个数转换成相应的十进制,就是范围,其实,我理解错了,为什么呢,这里的所谓的11111111是补码,而我把补码的表示当成了原码的表示来转换成十进制,这就是错误的根源,说明我以前是没理解补码和原码的区别)

    那么,8位表示的有符号数的范围是:-128~127,如果n

    =16,那么能够表示的有符号数整数的范围是-32768~32767(记住这个范围)

    例如,假设机器字长是16位,写出-117D的补码表示:

    -117D = 216-117D 我把每个数都转化成2进制,也就是1 0000

    0000 0000 0000 – 0000 0000 0111 0101 = 1111 1111 1000 1011

    这个数转换成六进制就是 FF8BH。

    我采用书上的解法就是:

    首先:+117D可表示为: 0000 0000 0111 0101

    按位求反后为 1111 1111

    1000 1010

    某位加1 后: 1111 1111

    1000 1011

    表示成十六进制: F F 8 B(最终结果)

    如果,对于无符号数来说,8位无符号数的表示范围:0<=n<=2的n次方-1,即:0~255

    16位无符号数的表示范围:0<=n<=2n的n次方-1,即:0~65535(也要记住)

    符号扩展,常需要把一个n位二进制数扩展为m位二进制数,(m>n),当要扩充的数十无符号数时,只要在最高位前扩展m-n个0,例如,21的8位二进制和16位二进制的补码表示如下:00010101

    8位, 0000000000010101 16位

    如果要扩展的数是有符号数,并且采用补码形式表示,进行符号扩展,如:-3的8位二进制补码和16位二进制补码如下:-3 1111 1101

    8位补码,1111 1111 1111 1101 16位补码,

    补码的加法和减法

    把一个二进制按位求反,末位加1的运输称为求补运算。求补运算有个特性,[X]补---》求补[-x]补

    --à求补[X]补,就是,比如,3的补码表示是:00000011,这个数求补:11111101

    -3,对-3再求补,就变成了00000011,则又变成了整数3,

    例如:用8位二进制计算,25+(-32)

    我们用求补码的方式来解决这个问题,25是整数,他的补码为:00011001,

    (-32)的补码是:先求32的补码:00100000,对它求反:11011111,末尾加1,得:11100000,然后把它与25的补码00011001相加得11111001,这个数最高位为1,肯定是个负数,我们对这个数求反再末尾加1,得00000111,刚好为7,根据补码的那个求补特性,[X]补---》求补[-x]补

    --à求补[X]补,所以11111001就是-7,跟我们用十进制算出来的结果一样。

    展开全文
  • 十进制数-38的8位二进制补码是首先,写出原码 :? 1010 0110?? ,???? 最高位的1表示负号?负数的补码是其原码的各位取反,再加1 ,(最高位符号位除外),所以,?十进制数-38的8位二进制补码是?? 1101 1010关于二进制...

    十进制数-38的8位二进制补码是

    首先,写出原码 :? 1010 0110?? ,???? 最高位的1表示负号?负数的补码是其原码的各位取反,再加1 ,(最高位符号位除外),所以,?十进制数-38的8位二进制补码是?? 1101 1010

    关于二进制补码,它可以用来表示小数吗二进制补码可以用来表示小数吗?还有给我一段二...

    【二进制补码可以用来表示小数吗?】

    可以,不过需要你自己来处理.方法是,按照所需要的精度,将该小数放大若干倍,当整数处理.

    为方便通常放大2的若干次方倍.

    这样,你就可以把这个整数看成“定点小数”,即保留了若干位二进制小数的定点数.

    有些资料上,将这种格式称作Q格式.如“Q8格式”就是保留了8位小数位的定点数.

    这种定点小数,做加减法时,需要小数点对齐,必要时需先做移位操作.

    乘除法时,也要掌握小数点位置.例如“Q8格式”和“Q4格式”的数相乘,其积应该看做“Q12格式”的.

    需注意C语言中的移位操作中,其“右移”分为“算术右移”和“逻辑右移”两种.对于“有符号”数,实行的是“算术右移”,对于“无符号数”,实行的是“逻辑右移”.

    如果您的程序中定义变量类型时定义的正确,那么你这些右移操作就不会错误.

    如果您的程序中有“无符号”和“有符号”混用的地方,或强制类型转换的地方,需要注意这点不要出错.

    “算术右移”和“逻辑右移”的区别:

    “逻辑右移”时最高位一律补零.

    “算术右移”时最高位保持不变,即:负数补1,正数补零.

    例如,用Q4的格式来表示0.75,放大2的4次方倍,为12,

    机器码是0000000000001100

    可以看做是定点小数000000000000.1100

    另,用Q4的格式来表示-0.75,放大2的4次方倍,为-12,

    机器码是1111111111110100

    可以看做是定点小数111111111111.0100

    如上,按Q4格式,用12代表0.75,用-12代表-0.75.

    要做(0.75)×(-0.75)用(12)×(-12)代表,乘得(-144).

    -144的机器码是1111111101110000

    看做Q8格式的定点小数11111111.01110000

    可以代表-0.5625.(等于-144/256,即-9/16)

    假如下面又要做别的运算,需要把这个Q8的定点小数化为Q4格式,那么,可以用>>4的运算,把这个数“算术右移”4位,得111111111111.0111.(这个数,如果当普通整数看,就是-9.)

    请注意这里右移的时候最高位补了4个1.

    【给我一段二进制补码,我怎么将其还原成十进制的数值?】

    首先,要知道其字长.以16位字长为例:

    16位字长如果是无符号数,可以表达的十进制数的范围是0 ~65535;

    如果是有符号数,可以表达的十进制数范围是-32768 ~ +32767.

    这里65536是2的16次方,32768是2的15次方.

    正整数的二进制化十进制想您应该知道吧?例如10010000化为十进制就是

    ((((((1×2+0)×2+0)×2+1)×2+0)×2+0)×2+0)×2+0 = 144

    给你一个有符号数的补码表示法的16位二进制代码,暂时先按照上述无符号数(即正整数)的规则,化为十进制;

    然后,看其符号位(最高二进制位)是否是1:

    如果是0,就表示它是正数.结果就对了.

    如果是1,就表示它应是负数,将此暂时值再减去65536,所得结果(负数)就是应有的结果了.

    上述“看其符号位是否是1”的判断,也可以代之以“看暂时值是否不小于32768”.

    例如:1111111111110111按照上述规则,得暂时值为65527.

    因为符号位是1,说明它应该是负数:65527 - 65536 = -9.

    对于n位二进制有符号补码除法x/y,要求不溢出的条件如下图,求解释为什么不溢出的条件是这样的

    y在分母,分母不能为0,就是y≠0了。这和数学当中的要求是一样的,编程时也要用条件语句来判断,然后再计算。

    C语言求二进制补码?源代码

    输入任意整数,输出32位的补码。

    输入其他,结束程序。

    #include

    int main()

    {

    int i,num=0;

    char s[33]={0};

    while(1==scanf("%d",&num)){

    for(i=0;i<32;i++){

    s[i]= (0x01 & (num>>(31-i))) ? '1' : '0' ;

    }

    printf("%s\n",s);

    }

    return 0;

    }

    展开全文
  • 十进制转二进制补码(正负都可) 指针初学 将一个十进制正(负)整数转换为对应的二进制补码(用指针完成 十进制转二进制:1.先判断该整数是正数还是负数 如果是正数则二进制补码首位为1 , 且对应的二进制补码就是原. 如果...

    十进制转二进制补码(正负都可) 指针初学

    将一个十进制正(负)整数转换为对应的二进制补码(用指针完成

    十进制转二进制:1.先判断该整数是正数还是负数 如果是正数则二进制补码首位为1 , 且对应的二进制补码就是原. 如果是 负数 则二进制补码为原码基础上取反且末位加1(加1则涉及进位 )

    代码:

    #include"stdio.h"
    #include"Stdio.h"
    int main()
    {
    	int *p;
    	int x,i;
    
    	printf("输入一个十进制整数:");
    	scanf_s("%d", &x);
    
    	p = (int *)malloc(sizeof(int) * 32);//为二进制分配内存空间
    
    	if (x < 0)//负数转正  如果为负数 二进制第一位为1 正数则为0
    	{
    		*p = 1;
    		x = -x;
    	}
    	else if (x > 0)    *p = 0;
    	//判断正负    改首位
    	//-----------------------------------------------------------------------
    	for(i=31;i>=1;i--)//原码
    	{
    		*(p+i) = x % 2;
    		x = x / 2;
    	}
    	//-----------------------------------------------------------------------
    
    	//二进制取补码规则;若x为负数则 源码换反码 且反码末位加1
    	if (*p == 1)//换反码
    	{
    		for (i = 1; i <=31; i++)
    		{
    			if (*(p+i) == 1)       *(p + i) = 0;
    			else				   *(p + i) = 1;
    		}
    	}
    
    	if (*p == 1)//负数
    	{
    		if (*(p+31) == 0)	*(p + 31) = 1;//最后一位为0 则直接加1
    		else if (*(p + 31) == 1)      //最后一位为1   进位 
    		{
    			for (i = 1; i <= 31; i++)
    			{
    				if (*(p + 31) + 1 == 2 )//逢2进1
    				{
    					*(p + 31) = 0;
    					*(p +30) += 1;
    				}
    				else if (i > 0 && *(p + i) == 2)
    				{
    					*(p + i) = 0;
    					*(p + i+1) += 1;
    				}
    			}
    		}
    	}
    
    	//-----------------------------------------------------------------------
    	for (i = 0; i <= 31; i++)//输出
    	{
    		printf("%d", *(p + i));
    	}
    	printf("\n");
    
    	system("pause");
    	return 0;
    }
    

    运行测试:

    测试: 5 结果:000000000000000000000000000101

    测试   -5

    测试: -5 结果:11111111111111111111111111111011

    测试   -5

    测试: -7 结果:11111111111111111111111111111011

    测试  -7

    初学阶段,算法可能有问题,不妥的多提意见…

    参考资料:

    1.十进制转换为二进制、原码、反码、补码、移码.
    2.二进制补码 百度百科.

    展开全文
  • #define _CRT_SECURE_NO_WARNINGS #include int main() { int num = 0,i=0,n=1; while (n) { printf("请输入一个整数\n"); scanf("%d", &num); for (int i = 31; i >= 0; i--)
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    int main()
    {
        int num = 0,i=0,n=1;
        while (n)
        {
            printf("请输入一个整数\n");
            scanf("%d", &num);
            for (int i = 31; i >= 0; i--)
            {
                if (((num >> i) & 1) == 1)
                {
                    printf("1");
                }
                else
                {
                    printf("0");
                }
            }
            printf("\n");
            printf("是否继续(0.退出,1.继续)\n");
            scanf("%d", &n);
        }
        return 0;
    }
    展开全文
  • 补码: 整数补码:一个字节为例 ...结果:-127 的二进制补码为 10000001 2变10进制:例如:11111111 过程: 1.最高位归零 01111111 2.除最高位都取反 00000000 3.加1,转10进制 00000001 1 结果:11111111 是 -
  • 原码、反码、补码。本文列举了运用C语言操作符,列举三种求二进制补码中1的个数。
  • 二进制补码的特性

    千次阅读 2010-08-07 17:14:00
    C语言是一种较接近机器底层的语言,但它的语言标准中并没有规定有符号数要用二进制补码来表示;可事实上几乎所有平台上有符号数都用二进制补码来表示,它已成为“事实上的标准”,这无疑源于二进制补码巧妙的设计,...
  • 二进制转原码反码补码 C语言源码

    热门讨论 2011-09-28 11:35:57
    /* *功能实现任意二进制数的原码 反码 补码转换 *仅仅是字符串的操作,没有进行数字操作 *对-0的操作可能有问题 *ssfshine@gmail.com */
  • 二进制运算(正码、反码、补码)机器数(机器存储的数)​ 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1//比如byte类型是一个字节...
  • 想要在一个16位的补码中无视多余位,找出可以表示该带符号整数二进制补码的最少位数,我们需要的运用到C语言中一个非常有用的算法思想——拆半查找。 拆半查找: 搜索过程从数组的中间元素开始,如果中间元素正好是...
  • 四:二进制补码二进制: 数码:0,1基数:2二进制数的权展开式:(101.01) = 1*2²+0*2¹+1*2⁰+0*2⁻¹+1*2⁻²十进制转化为二进制: 除以二逆向取余法十进制转化为二进制(小数):乘以二顺向取整法在汇编中,在...
  • 首先先介绍一下整数在计算机中表示方法,数在计算机中都是用二进制表示,但是字节长度就不一定了,不同的机器可能就不一样而且在计算机系统中,补码是最重要的编码,数值一律用补码来表示和存储移码(又叫增码)是符号...
  • 首先,第一篇【谈谈二进制(一)】我们从进制本身的意义开始,认识了二进制和其他进制,然后完成了十进制和其他各种进制之间的转换。接着,第二篇【谈谈二进制(二)——四则运算】中,我们则通过十进制的四则运算原理,...
  • 源码如下: #include<stdio.h> //打印一个数据的二进制(补码) void disBin(char ch) { int i = 8; while(i--) { if((1<<i)&ch) printf("1"); else printf("0")...
  • 补码与反码在计算机中对数据进行运算操作时,符号位该如何表示呢?是否也同数值位一道参加运算操作呢??如果参加,会给运算操作带来什么影响呢???为了妥善地处理好这些问题,就产生了把 符号位 和 数值位 一起来...
  • C语言程序-求二进制串的补码

    千次阅读 2019-06-28 22:03:33
    转载自...求二进制串的补码 利用二进制的特征:0000取反加1为10000 #include<stdio.h> #include<string.h> int main() { char a[16]; int i,j,len,k; gets(a); l...
  • //写一个函数求a的二进制补码)表示中有几个1 //方法一(道理同十进制%10,/10) #include<stdio.h> int count_bit_one(unsigned int i){//无符号整型数可以在输入负数的情况下也可以正确输出 int count=0;...
  • //输出一个整数二进制补码)中1的个数 int count_bit_one(unsigned int n)//形参为无符号整数,对于负数而言,其最高位不表示符号位,表示有效位,这种思想至关重要 { int count=0; while(n) { if(n%2==1) ...
  • Given a positive integer, output its complement number....输入一个正整数,求其转为二进制之后的每位都取反的值(十进制)。没有符号位。 例如:输入的正整数为5,其二进制为101,取反为010,010转...
  • 1.在C语言中我们练习过正数二进制和十进制的转换 2.补码为反码+1,所以先取出反码,在通过运算末位为0,改为1.末位为1,改为0,加到当前位为0改为1 java代码如下:public static String converttoHex(byte a) { ...
  • 有这样一道题目 ``` int main() ...在网上查了相关资料,说是关于补码与原码转换的 ...疑问1:十六进制在内存中是否是转化...疑问3:自减符号是不是在二进制运算上相当于原来的补码加了个负一的补码? 求大佬解答
  • 二进制数据虽然可以直接被CPU计算识别,但是不方便书写、记录,把二进制数据转换为八进制是为了方便记录在文档中。 随着CPU的位数不断的增加,由早期的8位逐渐发展成了现在的64位,因此八进制就不能满足需要了,所以...
  • 用C++6.0编写的计算器,内含整数小数加减乘除、二进制数组加减及求原码补码反码!#include#includeint main(){void top();void no1(),no2(),no3(),no4(),no5(),no6(),no7(),no8(),no9(),no10(),no11(),no12(),no13(),...
  • 174-C语言入门(进制补码,类型)

    千次阅读 2021-02-05 18:15:13
    进制 进制以十进制为例 1234.5=110^3 + 210^2 + 310^1 + 410^0 + 5*10^-1 (按权展开求和) ○1 其它进制转十进制都是按权展开求和,比如十六进制 0x123=1 * 16^2 + 2 * 16^1 + 3 * ...○5 二进制转十六进制:二进制从右
  • 二进制的加减运算(原码,反码,补码的理解) 最近又看了,二进制加减法运算。对于很多新人可能对于二进制的加减法运算有不理解的地方,下面我将自己 的一些理解写下来,一方面做一些记录,另一方面希望能对大家有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 775
精华内容 310
关键字:

二进制补码c语言

c语言 订阅