补码与有符号数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无符号数、有符号数与补码
计算机中的整数数据分成有符号数和无符号数。无符号数是用所有的数据位表示数值,而有符号数则是用最高位表示数据的正负性,其余位表示数值。
例如:对于八位数无符号数,所有8位均是数据位,编码00000000-11111111表示0-255。而八位有符号数,其最高位代表符号,第7位表示数据。符号位是0代表正数,是1代表负数。
对于有符号数而言:当最高位为0时,代表正数,低7位就是这个正数的编码,如01111111,0表示正数,1111111表示其数值127,表示+127;当最高位为1时,代表负数,第7位的含义与编码方式有关。一般的计算机系统采用的是补码编码。
补码是针对有符号的负数的。它的数据位是由对应的正数编码取反加1而来的。例如:-100是个负数,最高位为1。其余位是+100的编码取反加1得到的。+100的7位编码是1101000,取反后7位变成0010111,再加1后7位变成0011000。则-100的补码形式为10011000
也可以直接将对应正数的8位进行取反加1,结果一致。
虽然,对负数的编码存在原码、反码与补码三种形式,但是真正用于计算机系统的只有补码。想C/C++等语言中的负数都是补码形式的。
C/C++语言中,用unsigned 表示无符号数,用signed或缺省表示有符号数。如unsigned int表示32位的无符号数,char表示8位有符号数。
不过,在C/C++语言中,给无符号数或有符号数赋值时,编译器并不严格地判断是否超过了范围。例如:char c=200;
c是用char定义的,是由符号数,而8位有符号数的表示范围是-128-127,200超过了这个范围。编译时没有错误。那么,究竟给c的是什么数?
其实,C/C++在将数据保存到某个变量时,只是把这个变量所需要的数据位给他,不关心其中是否包含符号位。作为一个有符号数,200在内存里的格式为11001000,将它存放到变量c所申请的内存单元中,由于c变量是有符号的,最高位的1代表是个负数。11001000作为补码形式的负数,就是-56。所以,c的实际数值就是-56。
对于补码表示的机器数,如果求出其真值?还是取反加1。11001000取反变成00110111,再加1变成00111000,表示56,最高位是1,是个负数,结果为-56。