catalog
我们知道,一个int a = -3
, 他的二进制是:
3
的二进制0...011
,取反1...100
,加1,1...101
那么,什么叫做: (一个数的 二进制)呢???
一个数的二进制,表示: 该数,在计算机里的 存储形式!
一定要清楚: 计算机里只有0和1!!! 他没有(正数和负数)的概念!!!
举个很好的例子:
int a = 0x80102030
。 a的地址是:p1,即[p1, p2, p3, p4]这些地址是a变量的
千万不要认为:([p1, p2, p3, p4])这些地址,就是属于 a变量的!!!
这个观点是极其错误的!!!(任何一个地址,都不属于任何变量。 只是说 a变量,只是指向了 p1
这个地址而已!!)
因为: 你可以单独 取出p1/p2/p3/p4
地址的内容。 ((char *)p3;
)
虽然a是个负数,他在计算机存储的是:[80] [10] [20] [30]
。
但在计算机里,完全不存在 正数负数的概念。 计算机只知道0/1,不知道是char、bool、int、string、、、、
即:(int *)p1
,这就获得了:(int)0x80102030,即结果是个负数
而(unsigned int *)p1
,这就获得了:(unsigned int *)0x80102030,即结果是个正数!
计算机也不是 是(int*)的指针,这是C语言做的。
因为,计算机最小存储单元,是1个字节
。
即,一个字节里,存的是:[0, ff]
。
比如,一个字节单元里,存的是:ff
,其实你完全不知道,这是个正数还是负数!!!
计算机的字节单元里,就是存的:[0, ff]
。
即,从计算机的角度,(其实都是:unsigned
的!!!)
比如说,一个单元里存的,都是1。
你的程序要用到这个存储单元 他的地址是p
,则:
- 第一步: 先获取,该单元的原生数据!!!
auto d = (unsighed char)p
此时这个d的值为255
,就代表: 该存储单元里,存储的原生数据!! - 第二步: (其实第二步就不重要了),这完全取决你,你想要把它(强转到)什么类型。
如果,就当unsigned来用 则值为255
。 否则,当成负数来用(强转到signed) 则值为-1