首页 > 技术文章 > 数据宽度和逻辑运算

doubleconquer 2021-11-18 12:14 原文

数据宽度

计算机数据

无符号数:正数
有符号数:正数、负数
当数据宽度为32位时:
无符号数00000000-FFFFFFFF
有符号数00000000-7FFFFFFF(正数)
80000000-FFFFFFFF(负数)
也就是 0正 1负

几个重要的计量单位

BYTE 字节 8位 1字节

WORD 字节 16位 2字节

DWORD 双字 32位 4字节

逻辑运算

或运算(or|)

只要有一个为1则结果 为1

与运算(and&)

两个数都是1才为1

异或运算(xor^)

相同为0 不同为1

非运算(not!)

取反 1取反就是0 0取反就是1

cpu如何计算2+3?

X:0010
y:0011
先异或:
0010
xor 0011

    0001

R(寄存器中):0001
异或完以后要判断是否运算结束
将两个数进行与运算然后左移一位
0010
and 0011

    0010

0010<<1 ==0100
如果结果全为0,结果则为我们所要的结果
否则,把上面的异或得到的值赋值到X中
把左移后的结果赋值到Y
X:0001
Y:0100
重复以上的操作(先异或,在与运算)
先异或
0001
xor 0100

    0101

R:0101
在将两个数进行与运算 然后左移动一位
0001
and 0100

0000

左移完结果全是0,结果为我们所需要的
最终结果为0101 = 5

CPU如何计算2-3?

X:0010
Y:1101( 3的二进制为0011取反1100加一为补码1101)
先异或:
0010
xor 1101

       1111

R:1111
两个数再进行与运算,然后左移一位
0010
and 1101
----------
0000
0000<<1=0000
如果权为0,结果为我们所要的结果
最终结果为1111= -1

在计算机中

正数是直接用原码表示的
负数时以其正值的补码形式表示的
下面数据以数据宽度为8为例
1的原码:0000 0001
1的反码:1111 1110
1的补码:1111 1111

同理可得:
8的原码:0000 1000
8的反码:1111 0111
8的补码:1111 1000
即1111 = -1

推荐阅读