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;
}

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

原文地址:https://www.cnblogs.com/nanfengnan/p/15187409.html