位运算符与表达式

1
2
int a=-3,b=3,x;
x=a^b;

求x值

  • a=-3 -3的补码为 3 :00000011

​ 反码:11111100

​ 补码:11111101

  • b=3 3的补码为00000011
  • ^为位异或符号 即异取1 同取0
  • 故取完为11111110 这为补码
  • 转换为原码为 ==补码取反加1== 11111110

​ 10000001

​ 10000010

补码的定义

  • ==在计算机中都用补码==
    • 正数的补码为本身
    • 负数的补码 即为其绝对值数的补码 eg.-3的补码为3的补码

整数安全漏洞

  1. 回绕(“特指无符号”)

    if 两字节 则无符号数的取值范围为0~65535

    故65535+1=0 0-1=65535

  2. 溢出 (“指有符号数”)

    以两字节为例 有符号数的取值范围为-32768~32767

    则32767+1=-32768

    beacuse:32767的补码为 0111 1111 1111 1111

    ​ 1 的补码为0000 0000 0000 0001

    ​ 相加得 1000 0000 0000 0000 为-32768的补码

  3. 截断(”特指字节“)

    • 宽度较大的整数存入宽度较小的整数 即高位被==截断==

Attention注意!

1
2
int a=1;
a= --a? ++a: --a

--a \\即a=0 后再继续--a\\即a=-1