• C语言基础之负数是怎么存储的?(六十一)


    问:计算机中,负数是怎么存储的?

    答案:计算机中的二进制数(包括正数和负数)是以补码形式存储。

    1.有符号的二进制数

    计算机中把最高为定义为符号位:

    用“0”表示正,用“1”表示负。

    2.补码定义

    正数的补码:是正数本身。

    负数的补码:去掉符号后,先按位取反,再加一。

    3.求补码栗子:

    例一、short num = -1;

    可知short占2个byte,2个byte为16位。

    -1的原码:

    1000 0000 0000 0000 0001

    提示:

    因为-1是负数,所以最高位符号位是1.

    -2的反码:(即按位取反)

    1111 1111 1111 1111 1110

    -2的补码:

    1111 1111 1111 1111 1111

    = 2^16 -1 = 65535 = 0xFF

    重点:16位数字最大表示为:65535

    例二、int count = -1

    可知int占4个byte,8位为一个byte,共32位。

    -1的原码:

    1000 0000 0000 0000 0000 0000 0000 0001

    -1的反码:

    1111 1111 1111 1111 1111 1111 1111 1110

    -1的补码:

    1111 1111 1111 1111 1111 1111 1111 1111

    = 2^32 -1 = 4294967295 = 0xFFFFFFFF

    重点:32位数字最大表示为:4294967295

    例三、long ss = -1;

    可知long占8个byte,一个byte8位,一个long占64位。

    -1的原码:

    1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

    -1的反码:

    1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 11111 1111 1111 1111 1111 1110

    -1的补码:

    1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 11111 1111 1111 1111 1111 1111

    = 2^64 -1 = 18446744073709551615 = 0xFFFFFFFFFFFFFFFF

    重点:64位数字最大表示为:18446744073709551615

    例四、正数和负数相加运算。

    short a = 2;

    short b = -1;

    a + b = 2 + (1) ?

    1.使用原码运算(得到错误结果)

    a = 0000 0000 0000 0010

    +

    b = 1000 0000 0000 0001

      = 1000 0000 0000 0011

    如果是有符号,最高为符号位是1表示负数,结果为:3;

    如果是无符号,结果为:32771

    总结:这种算法,计算机得不到正确的结果,也是负数用补码表示的原因。

    2.使用补码二进制运算(得到正确结果)

    a = 0000 0000 0000 0010

    +

    b = 1111  1111  1111 1111

    =     0000 0000 0000 0001

    = 1

    最高位为0,表示正数。

  • 相关阅读:
    算法分析与设计——要求根据给定的正整数n计算第n个斐波那契数。
    几种简短的数据类型的介绍(主要介绍void)
    (三)构建网络模型
    (数字图像处理MATLAB+Python)第十二章图像编码-第三、四节:有损编码和JPEG
    Pytorch因nn.Parameter导致实验不可复现的一种情况
    ai 问答时刻
    IceRPC之调度管道->快乐的RPC
    【活动通知】2023 Elastic Meetup 北京站将于12月2日下午1点30在北京召开
    【场景题】如何排查CPU偏高的问题
    虚拟筛选、高通量实验筛选化合物库
  • 原文地址:https://blog.csdn.net/u010164190/article/details/127632497