PHP关于按位取反结果的推导过程

哎呀几年过去,都快把大学学的计算机导论的知识给忘完了,现在来回顾一下按位去反的流程:

<?php
/**
首先来补充一下基础知识:
php中有4个位运算,分别是&与 |或 ^异或 ~取反
& 两位全为1,结果为1
| 有一位为1,结果为1
^ 一个为0,一个为1,结果为1
~ 取反0->1,1->0

1.二进制的最高位是符号位,0表示正数,1表示负数。
2.正数的原码,反码,补码都一样。
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)。
4.负数的补码=它的反码+1。
5.0的反码,补码都是0.
6.php没有无符号数,换言之,php中的数都是有符号的。
7.在计算机运算的时候,都是以补码的方式来运算的,那么运算完后得到的结果也是某个数的补码
 **/
echo ~8;//-9

那么这个-9是怎么得来的呢?

8的原码、反码、补码都是 :

00000000 00000000 00000000 00001000

取反(即~8)后得到:

11111111 11111111 11111111 11110111  //第一位是符号位,1代表负号,表示这是一个负数;记住运算和运算结果都是用补码表示的,这是某个数的补码,我们还需要推导反码和原码

反码=补码-1,即:

11111111 11111111 11111111 11110110

原码(符号位不变,其他位取反):

10000000 00000000 00000000 00001001

所以结果是:-9

?>

  

原文地址:https://www.cnblogs.com/huangye-dream/p/4729558.html