C#十六进制和十进制有符号数值转换-----int和uint类型之前的转化

C# int和uint类型之前的转化

在编写串口协议时遇到十六进制和十进制数值之间的转化
目的是把四个字节的十六进制数值拼接转化为十进制数,但是当十进制数是负数的时候,怎么解决呢?
首先,四字节表示的有符号数的范围是-2^31 到(2^31) -1

十六进制十进制
00,00,27,1010000
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值