关于int、byte与bit之间的转换以及在计算机中的存储

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hen2315/article/details/81065561

首先,我们先确定几个基础的概念:

1.1个int占用4个byte;

2.1个byte占用8个bit;

3.byte的最高位为符号位,剩余7位为数值位,符号位为0表示正数,1为负数;

4.在计算机中数值以二进制的补码形式存储。

好。继续拓展,理解一下原码、反码和补码概念:

原码:将一个数值以二进制的形式展示;

反码:正数的反码就是它的原码,负数的反码就是原码的符号位不变,数值位取反;

补码:正数的补码就是它的原码,负数的补码就是反码的符号位不变,数值位加1;

比如说:15的原码是00001111,而-15的原码就是在符号位加1,也就是1000‭1111‬

数值 15 -15
原码 00001111 1000‭1111‬
反码 00001111 11110000
补码 00001111 11110001

所以-15在计算机中存储的补码就是11110001了。

在这里再稍微拓展一点点,补码是什么东西?

根据数学的定义,在十进制里:4+6=10  3+7=10,所以说4和6互补,3和7也是互补,那有什么意义呢?再来举个例子,8-4=4 8+6=14(4和6互补),我们可以看到8减去4或者8加上4的补码6,得到数的个位数是一样的,都是4,大家可以自己去尝试一下,其他二进制、八进制等等都是一样的。说了这么多,那到底有什么用呢,其实就是避免了减法,采用补码之后,可以将减法处理成加法,本来是-4的,那我们就+6,只要把得到高位去掉,那么得到的值,是和减法一样的。我们都知道,在计算机里其实是没有乘除的,一切的乘除都可以转化为加减,看上面我们可以知道减法也是可以由加法代替的,那么在最后,计算机只要能算加法就可以了。

好了,言归正传,上面我们说到1个int占用4个byte,1个byte占用8个bit,那么1个int就是32个bit,然后它们是byte为单位、以补码的形式存储的,而且是先存低位,再存高位。

举个例子 :20180717就是用4个byte储存,细化到bit就是32个,就是下面这样的,当然了,现在这个就是20180717的原码

00000001001100111110111011101101‬

4个byte分别就是"00000001"、"00110011"、"11101110"、"11101101‬";

计算机在存储的时候,就会把它们转成补码的形式,而20180717的补码就是它本身,但是byte的存储是从低到高的,所以20180717在计算机内存里表示就是"11101101‬"、"11101110"、"00110011"、"00000001"

再举个例子:-20180717

负数的原码就是它的正数原码最高位(符号位)加1,也就是说-20180717表示是这样的

原码:10000001 00110011 11101110 11101001‬

反码:11111110 11001100 00010001 00010110

补码:11111110 11001100 00010001 00010111

-20180717在计算机内存里表示就是"00010111"、"00010001"、"11001100"、"11111110"

我们可以在计算器内很直观的看到-20180717的二进制补码显示

-20180717的补码显示

而我们通过Visual Stuido 2013的反汇编窗口和内存显示窗口也可以清楚看到-20180717的16进制显示和在内存里的16进制显示

通过计算器或者反汇编窗口我们都可以得出FECC1113就是-20180717的16进制

通过内存窗口里的13 11 cc fe我们就可以看到-20180717是按byte的低位到高位的排列方式进行存储的

因为13正是一个byte"00010111"的16进制,11是"00010001"的16进制,cc是"11001100"的16进制,fe是"11111110"的16进制

展开阅读全文

没有更多推荐了,返回首页