计算机地址空间相关笔记

in #computer8 years ago

大小端

  • 小端:把高位信息放到高字节上,低位信息放到低字节上
  • 大端:把高位信息放到低字节上,低位信息放到高字节上

计算机虚拟地址空间大小

1个字长 = 4字节 = 32位
每一位有1、0两种状态,所以一共是2的32次方种状态。
也就是说,可以表示2的32次方个不同的数。
2^32 = 4294967296 = 4194304 * 1024 = 4096 * 1024 * 1024 = 4 * 1G
指针类型刚好是一个字长,所以指针能够表示4G内存空间的地址
因此,32位机器的虚拟内存空间大小是4G

移位操作

  • 左移:高位截断,低位补0
  • 右移:
    • 逻辑右移:高位补0,低位截断
    • 算术右移:高位补最高位数字,低位截断
  • JAVA的右移:
    • 逻辑右移:>>>
    • 算术右移:>>

如果需要移动K位大于等于被移动数的位数W,则先K mod W取余,再移位。

有符号数、无符号数

C、C++都支持有符号数(默认)和无符号数,JAVA只支持有符号数

双射

每个介于0~[(2^w)-1]的数都有唯一一个w位的值编码。反之亦然。

补码

正数的补码等于它本身
负数的补码等于数据位按位取反再加1
(特例:最小的负数10000000,它的补码还是它本身。因为它已经是最小了,取反加1会产生下溢)
二进制数的大小就是每一位的权相加。符号位的权需要加上符号。因此10000000就是最小的负数,因为符号位为负的权,负得最多,数据位没有正的数来抵消,因此是最小。同理,01111111就是最大的正数。

有符号数转换成无符号数

正数不变,负数要变大,因为把首位的负权变成了正权,相当于增加了2^w。
比如一个四位的正数
-8(+2^4) = 8U
-3(+2^4) = 13U
-2(+2^4) = 14U

无符号数转换成有符号数

0~2^(w-1)-1的数不变,(二进制以0开头)
其他数与上面相反,需要减去2^w (二进制以1开头)
8U(-2^4) = -8
13U(-2^4) = -3
14U(-2^4) = -2

有符号数与无符号数的运算

在C语言中,如果有符号数与无符号数运算,会先都当成无符号数来运算。这样就可能负数不一定小于一个正数。

Sort:  

Congratulations @walletang, you have decided to take the next big step with your first post! The Steem Network Team wishes you a great time among this awesome community.


Thumbs up for Steem Network´s strategy

The proven road to boost your personal success in this amazing Steem Network

Do you already know that awesome content will get great profits by following these simple steps that have been worked out by experts?

Congratulations @walletang! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Do not miss the last post from @steemitboard:

Carnival Challenge - Here are the winners
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.05
TRX 0.33
JST 0.078
BTC 63144.83
ETH 1685.61
USDT 1.00
SBD 0.39