数据在计算机中的存储之--正负整数

 

 

段落1. 百度百科char

char用于C或C++中定义字符型变量,只占一个字节,取值范围为 -128 ~ +127(-2^7~2^7-1

 

知识点:负数在计算机中以补码存储,而正数以原码存储。

为什么负数在计算机中以补码存储呢?

因为所以科学道理,可以看这篇知乎文章:https://www.zhihu.com/question/335614901/answer/755608419 

不看也可以,只要知道负数在计算机中有用补码来存储的必要性就行了,而且这个必要性是有科学道理的。

 

段落2.   求正数在计算机中存储的二进制值

请问 char j = 5 这句代码中,  j 在计算机中存的二进制值是多少?

正数以原码存储,5的原码是0b0000 0101.   所以 j 在计算机中存的二进制值是 0b0000 0101 。

 

 

 

 

段落3.   求负数在计算机中存储的二进制值

请问 char j = -12这句代码中,  j 在计算机中存的二进制值是多少?

负数以补码存储

先找对该负数对应的正数,即12。 12 的原码是 0b0000 1100 .    

我们将上述原码的最高位置为1, 得到0b1000 1100.

然后再求补码:

0b1000 1100 , 符号位不变,其余各位取反 =》0b11110011 再加1 =》得到0b11110100 。

我们最终得到的0b11110100 等价于0xF4。

 

我们来写代码验证一下,思路是使用%x来打印出其十六进制的内存值。不过%x会打印出4字节,我们只需关注最低一个字节就行了。

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>

int main(){

    char j = -12;

    printf("%x \n", j);

    return 0;
}
root@lmw-virtual-machine:/home/lmw/桌面/C_Text# ./ab
fffffff4 
root@lmw-virtual-machine:/home/lmw/桌面/C_Text# 

  

 上面提到可以先找到该负数对应的正数12, 那么12的原码可不仅仅是0b0000 1100 , 还可以是0b 0000 0000 0000 0000 0000 0000 0000 1100 (32位, 合计4字节

 相同的操作手法我们再来一遍,

 我们将上述原码的最高位置为1, 得到0b1000 0000 0000 0000 0000 0000 0000 1100 .

 然后再求补码:

 符号位不变,其余各位取反 =》0b1111 1111 1111 1111 1111 1111 1111 0011,  再加1 =》得到 1111 1111 1111 1111 1111 1111 1111 0100 

 我们最终得到的0b1111 1111 1111 1111 1111 1111 1111 0100 则等价于 0xFFFFFFF4。

 

 

   

  

补充段落:

如果赋值的数是超过char类型的上限值的,那么先减去256的倍数, 再根据上面方法计算其在计算机中存储的二进制值。

数据在计算机中的存储之--正负整数 

 

 

 

.

上一篇:deepin系统安装与linux磁盘分区


下一篇:原码 反码 补码