zoukankan      html  css  js  c++  java
  • C语言中的有符号数和无符号整形数转换

    1.有符号数和无符号数的转换

    C语言允许不同数据类型之间进行强制类型转换,同时描述一个原理:
      1.计算机中数据的存储一般都是补码,
      2.计算机在强制类型转换的结果是保持位值不变(内存中存储的补码不改变),仅仅改变了数据的解释方式
      3.有符号数转换成无符号数
        1.判断有符号数最高位是否为1,如果有符号数最高位为1,则把有符号数解释为补码(求真值:符号位不变,数值位取反,末位+1)
      
      2.如果有符号数最高位为0,则直接把有符号数解释为无符号数
      4.无符号数转换成有符号数
        1.判断无符号数最高位是否为1,如果无符号数最高位为1,则把无符号数解释为补码(求真值:符号位不变,数值位取反,末位+1)

        2.如果无符号数最高位为0,则直接把无符号数解释为无符号数
    请观察如下代码:
    #include "link_node.h"
    #include <bitset>
    using namespace std;
    int main()
    {
    //有符号数向无符号数转换,存储不变,仅仅解释方式改变
    short x = 12; //带符号短整形 2B 表示数据范围:-32768~32767
    unsigned short y = (unsigned short)x; //无符号短整形2B 表示数据范围:0~65535
    cout<<bitset<16>(x)<<endl;
    cout<<bitset<16>(x)<<endl;
    cout<<x<<endl;
    cout<<y<<endl;
    //无符号数向有符号数转换
    unsigned a = 65535;
    short b = (short)a;
    cout<<bitset<16>(a)<<endl;
    cout<<bitset<16>(b)<<endl;
    cout<<a<<endl;
    cout<<b<<endl;

    return 0;
    }

     观察结果,发现,确实是内存中的补码存储未曾改变,仅仅是解释带符号数和无符号数的方式改变了,(补码解释)

  • 相关阅读:
    C#实现二维码生成与解码
    js中正则表达式使用
    Busybox镜像
    linux删除文件后,空间未释放的一种情况,使用lsof查看
    linux中.nfsxxxx引起的文件无法删除
    linux中的查找命令find,locate,which,whereis
    openj9
    Ali流量控制中间件Sentinel
    LDAP认证模式简介
    nginx支持ipv6
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/15187409.html
Copyright © 2011-2022 走看看