得程序设设 感减 20023
C语言程序设计 2002 年 第二章 基本数据类型和运算
235位运算 (1)整数在机内的表示 A.任何整数在计算机内以二进制码形式存放。 无符号整数,所有位都用来表示数据的值: 例: unsigned char ch;中 ch分配一个字节能表示的数值范围:0~255 有符号整数,存储长度的最高位用来表示符号, 0表示正数,1表示负数, 例 中 16位机中,i分配两个字节能表示的数值范围:-32768 32767
2.3.5 位运算 (1) 整数在机内的表示: A. 任何整数在计算机内以二进制码形式存放。 无符号整数,所有位都用来表示数据的值: 例:unsigned char ch; 中, ch分配一个字节能表示的数值范围:0 ~255 有符号整数,存储长度的最高位用来表示符号, 0表示正数, 1表示负数, 例: int i; 中, 16位机中, i分配两个字节能表示的数值范围:-32768 ~ 32767
正数用原码表示;负数用补码表示 符号位例:mt=12:i的存储形式 15141312111098765432 0 0000000000001100 例:intj=-1;j存储形式为1的反码加1 15141312111098765432 0000000000000001 1514131211109876543210 111|1111111111110 1514131211109876543210 1111111111111111
正数用原码表示; 负数用补码表示. 例: int i=12; i的存储形式: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 例: int j=-1; j的存储形式为1的反码加1: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 符号位
intj=-13;j的存储形式为 首先,13的存储形式为 1514131211109876543210 00000000000 01101 求反 1514131211109876543210 11111 0 反码加1 15141312111098765432 0 11111001
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 例: int j=-13; j的存储形式为: 首先, 13的存储形式为: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 求反 反码加1
例:intj=-32768:j的存储形式为32768的反码加1 1514131211109876543210 1000000000000000 求反 1514131211109876543210 11111 11 15141312111098765432 0 1000000000000000
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 例: int j=-32768; j的存储形式为32768的反码加1: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 求反 加1
注意:当超出范围时引起错误结果 例:intj=32768,j的存储形式为32768的原码与-32768 的存储完全相同 151413121110987654321 00000000 000000 例:intj=-32769,j的存储形式为1的反码加1: 151413121110 876543210 100000000000000 1514131211109876543210 111110 1514131211109876543210 011111111111111
注意:当超出范围时引起错误结果. 例: int j=32768; j的存储形式为32768的原码,与-32768 的存储完全相同,: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 例: int j=-32769; j的存储形式为1的反码加1: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
(2)运算符: (求反)&(按位与)|(按位或)^(按位加,异或 >(右移 (3)操作数类型:必须为整型 (4)运算符功能 (-)求反运算符(~) 单目将操作数的每一位取反(1变0,0变1) 例:inta=15; 15141312111098765432 000000000000 表达式~a(或-15)的存储形式为:(-16) 15141312111098765432 0 1111111111110000
(2) 运算符: ~(求反) &(按位与) | (按位或) ^ (按位加,异或) > (右移) (3) 操作数类型:必须为整型. (4) 运算符功能: ( 一) 求反运算符( ~ ): 单目,将操作数的每一位取反(1变0,0变1) 例: int a=15; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 表达式 ~a (或~15)的存储形式为: ( -16) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
(=)搜位与或、加(&、双目 inti=0127,j=0137531 151413121110 8765432 0 000000000101011 15141312111098765 32 0 0 11|1 10 001 i&j→81 1514131211109876543210 000000000 01010001 26=64 24=16
(二) 按位与、或、加(&、|、 ^): 双目 int i=0127, j=0137531; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 2 6=64 2 4=16 2 0=1 i & j ➔81
(二)按位或(1) inti=0127,j=0137531 1514131211109876543210 00000000010 011 1514131211109876543210 1011111101011001 i|j→-16545 1514131211109876543210 0 0 1j的绝对值为:214+27+25+20=16384+128+32+1=16545 15141312111098765432 0100000010100000 1514131211109876543210 0100000010100001
(二) 按位或( | ) int i=0127, j=0137531; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 i | j ➔ -16545 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 i | j的绝对值为:2 14+27+25+20=16384+128+32+1=16545
(二)按位加(): inti=0127,j=0137531 151413121110 8765432 0 00000000010101|1 15141312111098765432 0 101 11110101 001 1514131211109876543210 0111111100001101 表达式:i~j→-16626
(二) 按位加(^): int i=0127, j=0137531; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 表达式: i ^ j ➔ - 16626