• C语言中signed与unsigned的区别


    开始之前,先来了解下很基础的知识 - 计算机的存储单位和整数存储在计算机所占的内存大小。 
    1).计算机最小的存储单位是“位” 也就是bit或binary digits,用来存放一个二进制数,即 0或1。 8个二进制位为一个字节Byte。 
    2).对于 16-bit(16位)的计算机,int是以两个字节来储存的,而32-bit的计算机,则是以4个字节,即32个bit来储存的。 

    如果想要明白singed与unsigned的区别,除了这两个基本知识,还需要了解整数在计算机中的存储方式,以16-bit 计算机为例,定义 int a = 1; 那么a的存储方式用表格来表示 


    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1



    首先需要提到的一点是,在C语言中十进制的整数都会转化为二进制存储在计算机。继续,上面所声明的 int a = 1,也就是 int signed a =1,C语言默认a是一个signed类型。 上面表格中最左端的为最高位,最右端的为最低位。signed类型的整数,只用了去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整数。 
    而对于unsigned的整数,其16位全部用来编码,存储范围便是(0 to 2^16-1),即 0到 65535 的非负整数。所以呢 你可以声明 int a = 1,或者 int a = -1, 但是不可以声明 unsigned a = -1 。但是需要提到的一点是,不管整数的类型是signed 还是 unsigned,都用了16位来存储,也就是说16位全部用来存储数据 

    上面所看到 a=1 的存储方式,就是将十进制的a在 程序员计算器 上转化为2字节的2进制,然后将这个结果放到上面的表格里。(原码存储) 
    可是对于 int a = -1 是怎样存储的?也就是说负数的存储方式是怎样的? 
    负数是以(补码存储),即是以原码的补码形式存储,看下面的表格 

    原码

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1


    反码

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0



    反码就是将原码中的二进制1改为0,二进制0改为1。下面取得反码之后,在反码的基础上加上1.即 
    补码

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  • 相关阅读:
    类 2020年8月19
    随便一写,明天改正
    os模块 2020年8月16
    time 模块 2020年8月16
    collections模块 2020年8月16
    正则跟re模块内容2020年8月16日
    【C++设计模式二】C++工厂模式
    【C++设计模式一】C++简单工厂模式
    【01-springmvc快速入门、组件解析】
    03-【Spring 的 AOP】
  • 原文地址:https://www.cnblogs.com/turn2i/p/10450995.html
Copyright © 2020-2023  润新知