C# int和uint类型之前的转化
在编写串口协议时遇到十六进制和十进制数值之间的转化
目的是把四个字节的十六进制数值拼接转化为十进制数,但是当十进制数是负数的时候,怎么解决呢?
首先,四字节表示的有符号数的范围是-2^31 到(2^31) -1
十六进制 | 十进制 |
---|---|
00,00,27,10 | 10000 |
FF,FF,D8,F0 | -10000 |
但是用以下程序转化时,程序默认FF,FF,D8,F0转为无符号的十进制4,294,957,296
string byte1 = receivedData[0].ToString("x2");
string byte2 = receivedData[1].ToString("x2");
string byte3 = receivedData[2].ToString("x2");
string byte4 = receivedData[3].ToString("x2");
//将四个字节拼接并转化为 10进制
Int64 cc = Convert.ToInt64(byte1 + byte2 + byte3 + byte4, 16);
比如四个字节分别为00,00,27,10 用Convert.ToInt64把四个字节拼接并转化为十进制结果为10000
但是如果我想显示-10000,那么对应十六进制数字是FF,FF,D8,F0;但是若还是用上边的转化方法则结果为4,294,957,296
这就有问题了
解决方案
所以在设计到负数运算时,我用的方法是,若四个字节是FF,FF,D8,F0
uint cc = Convert.ToUInt32(byte1 + byte2 + byte3 + byte4, 16);//这一步首先转化为4,294,957,296
Int32 wd = (int)cc;//这一步将4,294,957,296转化为-10000
uint类型的数据转化为int类型的时候,因为int是带符号的类型,uint是不带符号的类型,且计算机存储数据都是用补码来存储的
所以uint转化为int时,若uint是正数,则转换结果不变,但是当uint是负数时,转化为带符
int和uint类型之前的转化原理
int类型的数据转化为uint类型的时候:
因为int是带符号的类型,当int是正数时,int类型数据转化为uint时不发生改变。
当int是负数时,int类型数据转化为uint类型时,值就要发生变化。
但转化的过程并不是去掉前面的负号,例如
int a=-1;
uint b=(uint)a;
这时b的结果并不是1;而是4294967295;
计算机中存储数据都是用补码来存储的,int的大小是4个字节,也就是32位,并且第一位是符号位;
而uint的大小同样是4个字节,32位,但没有符号位。
所当int a=-1;在计算机中存储的是补码:1111 1111 1111 1111;第一位是符号位。
执行uint b=(uint)a;转化为uint类型时,存储的依然是补码:1111 1111 1111 1111;没有符号位。
这时值就变成了4294967295。