340 likes | 481 Views
program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ( ( p[2]+p[3] ) div p[4] ) ; q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1];
E N D
program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ((p[2]+p[3]) div p[4]); q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1]; q[4]:=q[1]+q[2]+q[3]; x:=(q[0]+q[4]+2)-p[(q[3]+3) mod 4]; if (x>10) then y:=y+(q[1]*100-q[3]) div (p[p[4] mod 3]*5) else y:=y+20+(q[2]*100-q[3]) div (p[p[4] mod 3]*5); writeln(x,',',y); end. /*注:本例中,给定的输入数据可以避免分母为 0 或下标越界。 输入:6 6 5 5 3 第十三届第一题
D7 D6 D5 D4 D3 D2 D1 D0 符号位 数值位 0 正数 D7 = 1 负数 机器数 真值 01010010B = +82 82 11010010B = 8位带符号数:
0 正数 最高位为符号位 1 负数 二、带符号数的三种表示方法 1. 原码 后面n-1位是数值。 [+4]原= 0 000 0100B [4]原= 1 000 0100B
原码的特点: (1) 数值部分即为该带符号数的二进制值。 (2) “0”有+0和- 0之分,若字长为八位,则:(+0)原=0 0000000,(–0)原=1 0000000 (3) 8位二进制原码能表示的数值范围为:01111111~11111111,即+127~–127。
2. 反码 正数的反码与其原码相同。 负数的反码除符号位外将原码求反。 [+5]原= [+5]反= 0 000 0101B [5]原= 1 000 0101B [5]反= 1 111 1010B
反码的特点: (1) “0”有+0和-0之分。 (2) 8位二进制反码所能表示的数值范围为+127~–127, 一般地,对于n位字长的计算机来说,其反码表示的数值范围为+2n-1–1~–2n-1+1。 (3) 8位带符号数用反码表示时,若最高位为“0”(正数)则后面的7位即为数值;若最高位为“1”(负数), 则后面7位表示的不是此负数的数值,必须把它们按 位取反,才是该负数的二进制值。 [5]反= 1 111 1010B
3. 补码 正数的补码与其原码相同。 负数的补码是其反码+1,即相应正数按位求反后在末位加1。 [5]原= 1000 0101B [5]反= 1111 1010B [5]补= 1111 1011B 已知原码求补码是取反加一,已知补码求原码依然是取反加一(符号位不变) 0取反加1试试
补码的特点: (1) [+0]补=[–0]补=00000000,无+0和–0之分。 (2) 正因为补码中没有+0和–0之分,所以8位二进制补码所能表示的数值范围为+127~–128;同理可知,n位二进制补码表示的范围为+2n-1–1~–2n-1。在原码、反码和补码三者中,只有补码可以表示–2n-1。 补码中1000 0000 代表-128 (3) 一个用补码表示的二进制数,当为正数时,最高位(符号位)为“0”,其余位即为此数的二进制值;当为负数时,最高位(符号位)为“1”,其余位不是此数的二进制 值,必须把它们按位取反,且在最低位加1,才是它的二进制值。
原码:最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1,符号位除外。
为什么要设立补码呢? 第一是为了能让计算机执行减法: [a-b]补=a补+(-b)补 第二个原因是为了统一正0和负00原码是00000000 -0原码是10000000 这两个数其实都是0,但他们的原码却有不同的表示。 0反码是00000000 -0反码是11111111 0补码是00000000 -0补码是00000000 特别注意补码中1000 0000 代表-128 假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为 (-127~-0 +0~127)共256个. 在补码中用(-128)代替了(-0),所以补码的表示范围为: (-128~0~127)共256个.
补码的加法规则: [x + y]补= [x]补+ [y]补 补码的减法规则: [x-y]补= [x]补+ [-y]补
[99]补 01100011 + 11000110 [ 58]补 [41]补 1 00101001 自动丢失 例. 计算y = 99 58 (用8位二进制表示) 99 58 = 99 + ( 58)=41 [y]补= [99 58]补= [99]补+ [ 58]补 [99]补= 0110 0011B [ 58]补= 1100 0110B y = [y]补= 0010 1001B = 41
十进制 二进制 [25]补= 0001 1001B 25 0001 1001 [ 32]补=1110 0000B – 32 1110 0000 + [ 7]补=1111 1001B – 7 1111 1001 [ 25]补= 1110 0111B 1110 0111 – 25 1110 0000 + [ 32]补=1110 0000B – 32 1 1100 0111 [57]补=1100 0111B – 57 自动丢失 例. 机器字长为8位。
4. 溢出的概念 8位二进制补码表示数的范围:128 ~ +127 n位二进制补码表示数的范围:2n1 ~ +(2n1 1) 若运算结果超过了字长一定的机器所能表示数的范围,称为溢出。此时运算结果出错。
CS+1 CS 00 00001111 +15 + 01110000 +112 +127 01111111 例1. 令CS为数值部分向符号位的进位,CS+1为符号位向高位的进位,此例中, CS=CS+1=0,结果在8位二进制补码表示范围内,没有溢出。
CS+1 CS 01 +126 01111110 +5 + 00000101 125 10000011 例2. 此例中,Cs≠CS+1,产生了错误的结果,发生了溢出。
+127 01111111 例3. +5 + 00000101 124 10000100 结果出错。 CS=1, CS+1=0, 结果溢出!
因为CS = CS+1, 则结果正确。 CS CS+1, 则结果溢出。 所以溢出= CS CS+1 10000100 124 例4. 5 + 11111011 1 01111111 +127 结果出错。 CS=0, CS+1=1, 结果溢出!
综上所述,对计算机而言,补码的引入使带符号数的运算都按加法处理。如果CS和Cs+1的值相等,则表示运算结果正确,没有溢出,运算结果的正与负由符号位决定;如果CS和Cs+1的值不等,则表示运算结果不正确,发生了溢出现象。在计算机中,常用“异或”电路来判别有无溢出发生,即CSCs+1=1表示有溢出发生,否则无溢出发生。
1、Tg16 14. 在整数的补码表示法中,以下说法正确的是( AC )。 A.只有负整数的编码最高位为1 B.在编码的位数确定后,所能表示的最小整数和最大整数的绝对值相同 C.整数0只有一个唯一的编码 D.两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出 2、[x]补码=10011000,其原码为(B ) A.011001111 B.11101000 C.11100110 D.01100101 提示:已知原码求补码是取反加一,已知补码求原码依然是取反加一(符号位不变) 3、下列关于十进制数100的正确说法是( ABD )。 原码为01100100B B.反码为64H C.反码为9BH D.补码为64H 4、关于“0”的原码、反码和补码描述正确的是(C) A.“0”的原码只有一种表示方法 B.“0”的反码只有一种表示方法 C.“0”的补码只有一种表示方法 D.“0”的原码、反码和补码均有两种表示方法
一、数的定点和浮点表示 计算机在处理数据时,要考虑到小数点的位置。如果将小数点固定在某一位置,则称为定点表示;如果小数点可以任意移动,则称为浮点表示。 1.数的定点表示法——定点小数和定点整数 ⑴定点小数格式:小数点的位置固定在最高数据位的左边,小数点前面再设一位符号位。 任何m位二进制小数在计算机中用m+1位二进制表示。 0.1011 由于小数点总是在符号位与最高数据位之间,因此在计算机中不明确表示出来
⑵定点整数格式:小数点位置固定在最低数据位的右边。⑵定点整数格式:小数点位置固定在最低数据位的右边。 整数又分为带符号和不带符号的两类。 带符号的整数,符号位安排在最高(最左)位。 由于小数点固定在最低数据右边,因此在计算机中不明确表示出来。n位带符号整数N=NsNn-1…Nn-2N1N0在计算机中用n+1位二进制表示。 对于不带符号的整数,把所有n+1位二进制位全部视为数值。 在不同计算机中,使用多种位数的整数。16位,32位,64位,64位二进制来表示一个整数。 1101
2.数的浮点表示法 浮点数是指小数点数据中的位置可以左右移动的数。一个数N要用浮点数表示可以写:N=M*RE M:浮点数的尾数。E:浮点数的指数或阶码。 R:浮点数的基数,是常数一般取2、8或16 一旦机器的浮点部件设计好了,基数的大小也就确定了,不能再改变了,基数在浮点数表示中不出现,是隐含的。 ⑴浮点数的表示方法: M:尾数。用定点小数表示,表示浮点数的有效位,其位数 n的大小决定了浮点数的精度。 E:阶码。用定点整数表示。阶码用于表示小数点在浮点数中的位置。其位数m的大小反映此浮点数所能表示的数的范围。 1101.11=0.110111*24
数字与字符的编码 一、数字的编码(BCD码) BCD码是一种常用的数字编码。 BCD码:Binary-Coded Decimal,即二进制编码的十进制数。用[… ]BCD表示。 这种编码法分别将每位十进制数字编成4位 二进制代码,从而用二进制数来表示十进制数。
BCD码与二进制之间通常要经过十进制实现相互转换。 例 [0100 1001 0001.0101 1000]BCD = 491.58 0100 0011B = 67D = [0110 0111]BCD
十进制数 格雷码 十进制数 格雷码 0 0000 8 1100 1 0001 9 1101 2 0011 10 1111 3 0010 11 1110 4 0110 12 1010 5 0111 13 1011 6 0101 14 1001 7 0100 15 1000 2. 格雷码(Gray Code) 四位格雷码的编码表
格雷码的特点 (1)任意两个相邻数所对应的格雷码之间只有一位不同,其余位都相同。 (2)为镜像码。n位格雷码的前、后2n-1位码字除首位不同(前2n-1位码字首位为0,后2n-1位码字首位为1),后面各位互为镜像。 2位格雷码 00 01 00011110 1位格雷码 01 11 10
3位格雷码 00011110 0000 000001011010110111101100 2位格雷码 00011110 1111 10110100
奇偶校验 计算机中数据在进行存储和传输过程中可能会发生错误。为了及时发现和纠正这类错误,在数据传输(存储)过程中要进行校验,常用的校验方法就是奇偶校验。 奇偶校验能发现一位或奇数位错误,且不能纠正错误。一般以字节(八位二进制)为单位加1位奇偶校验位。奇偶校验分奇校验和偶校验两种。 一、奇校验:一个字节前面加一位校验位使得“1”的个数保持为奇数,若八位二进制数中“1”的个数为偶数,则校验位为“1”;若八位二进制数中“1”的个数为奇数,则校验位为“0”。 【例1】给10011001 01101101加奇校验结果为110011001 001101101 二、偶校验:一个字节前面加一位校验位使得“1”的个数保持为偶数,若八位二进制数中“1”的个数为偶数,则校验位为“0”;若八位二进制数中“1”的个数为奇数,则校验位为“1”。 【例2】给10011001 01101101加偶校验结果为010011001 101101101
3. program S403; var a1:array[1..50] of integer; i,j,t,t2,n,n2:integer; begin n:=50; for i:=1 to n do a1[i]:=0; n2:=round(sqrt(n)); for i:=2 to n2 do if(a1[i]=0) then begin t2:=n div i; for j:=2 to t2 do a1[i*j]:=1; end; t:=0; for i:=2 to n do if (a1[i]=0) then begin write(i:4); inc(t); if(t mod 10=0) then writeln; end; writeln; end. 输出: