负数转换为无符号类型数据的理解及应用

  • 负数转换为无符号数据类型的理解及应用
    • 有符号整型和无符号整型的转换
    • 有符号类型和无符号类型的转换应用实例
    • 参考文献

负数转换为无符号数据类型的理解及应用

网上有大量的资料说明,负数转换为无符号整型数后,数值会发生变化,因此不建议将负数转换为无符号整型,但是真的是这样吗,为什么会这样呢,我参考了一些博客的内容,并通过一些实践来验证观点。

有符号整型和无符号整型的转换

一篇博客中这样写到:当执行一个运算时,若它的一个运算数是有符号的,而另一个数是无符号的,那么C语言会隐式地将有符号参数强制转换类型为无符号数,并假设这两个数是非负的,来执行这个运算。
那么,C语言强制转换的处理具体是怎么做的呢?
首先,整数在计算机中是以补码的形式存在的 ;
其次,在C语言中,处理同样字长的有符号数和无符号数之间的相互转换的一般规则是:数值可能会改变,但是位模式不变 ;
以-1为例进行说明,-1的补码是1111,1111,1111,1111;将-1转换成unsigned int 之后,它在内存中的表示还是没有改变,还是1111,1111,1111,1111
数据类型对于计算机底层是没有意义的,只有非0即1,只有在高层的应用程序中才有意义。因此,同样的储存对于应用程序而言可能会对应着不同的数据,例如1111,1111,1111,1111对于有符号的数而言,就表示**-1**,单对于无符号数而言,它表示UMax(作为正数,原码和反码补码都一样),这样理解可能还不是很明白,直接看输出的话可能会有一定帮助。

unsign int a=-4000;
printf("%d\n",a);
printf("%u\n",a);
printf("%x\n",a);

printf的输出格式:
%d表示以十进制形式输出带符号整数;
%u表示以十进制形式输出无符号整数;
%x表示以十六进制形式输出无符号整数;
运算的结果可以先猜一下:

以十进制的形式输出结果理解上并没有什么难度,问题是以十六进制形式输出的无符号整数和以带符号整数直接转换为十六进制输出的话,结果是一致的。说明了上述的观点是正确的。

有符号类型和无符号类型的转换应用实例

为什么要专门聊一下有关有符号整型和无符号整型的转换呢,是因为控制伺服电机时,其位置控制模式中有控制增量位置和控制绝对位置两种。控制增量位置的话就可能会有负数出现,控制绝对位置的话,就只有正数,而libmodbus库中关于modbus_write_registers的定义如下:

int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src);

其中关于src的数据类型定为uint16_t,在libmodbus库中的定义uint16_t是unsigned short类型,因此需要注意负数和无符号类型的转换。
从上一节内容可知,对负数进行强制转换为无符号类型,十六进制的输出结果与有符号的输出结果相同,因此此处可强制转换。

//伺服电机反转的代码
void myWidget::on_pushButton_clicked()
{int rc;nb=ADDRESS_END-ADDRESS_STRAT;tab_reg=(uint16_t*)malloc(nb*sizeof(uint16_t));memset(tab_reg,0,nb*sizeof(uint16_t));/*写入保持寄存器数值*/nb_loop=nb_fail=0;while(nb_loop++<LOOP){for(addr=ADDRESS_START;addr<ADDRESS_START+1;addr++){const uint32_t num1=-10000;qDebug()<<num1;int i;for(i=0;i<1;i++){tab_reg[0]=(uint16_t)(0x0000FFFF&num1);tab_reg[1]=(uint16_t)(0xFFFF0000&num1)>>16;qDebug()<<tab_reg[i];}{rc=modbus_write_registers(ctx,addr,2,tab_reg);if(rc!=2){fprintf(stderr,"%s\n",modbus_strerror(errno));qDebug()<<"rc错误"<<modbus_strerror(errno);nb_fail++;}else{qDebug()<<"链接成功";printf("reg[%d]=%d(0x%x)\n",addr,tab_reg[addr],tab_reg[addr]);qDebug()<<"rc收到:"<<tab_reg[addr];}}}}
}

参考文献

1.负数时的有符号整型和无符号整型的转换
2: C/C++中printf和C++中cout的输出格式
3.libmodbus官方手册中文翻译

负数转换为无符号数据类型的理解及应用相关推荐

  1. Java无符号数据类型

    Java不支持无符号数据类型.byte,short,int和long都是有符号数据类型.对于有符号数据类型,值范围的一半存储正数,一半用于负数,因为一个位用于存储有符号值的符号. 例如,一个字节需要8 ...

  2. java int 无符号_Java 无符号数据类型

    Java数据类型教程 - Java无符号数据类型 Java不支持无符号数据类型. byte,short,int和long都是有符号数据类型. 对于有符号数据类型,值范围的一半存储正数,一半用于负数,因 ...

  3. C语言 有符号类型转换为无符号类型

    C语言中变量的类型变换比较多,有些地方需要时刻注意,不然很可能写出带有bug的代码并深埋入系统,难以察觉. 例如 有符号类型和无符号类型运算,有符号类型转换为无符号类型. 需要注意的有两种情况: 1. ...

  4. php无符号整数转有符号整数,PHP中把有符号整型转换为无符号整型方法_PHP教程...

    PHP中把有符号整型转换为无符号整型方法 这篇文章主要介绍了PHP中把有符号整型转换为无符号整型方法,转换的方法很简单,本文直接给出转换方法,需要的朋友可以参考下 在一个短地址项目中,根据六位字符与I ...

  5. 解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)

    转自:http://blog.csdn.net/angle635/article/details/22035427 前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过, ...

  6. php 有符号整数,PHP中把有符号整型转换为无符号整型方法

    这篇文章主要介绍了PHP中把有符号整型转换为无符号整型方法,转换的方法很简单,本文直接给出转换方法,需要的朋友可以参考下 在一个短地址项目中,根据六位字符与ID的相互映射的算法,当ID超过214748 ...

  7. 负数转无符号运算 (-1对256取模)

    c++primer5遇到了这个-1对256取模,负数取模还真的不清楚,所以查了查资料,供大家参考. 原文是这样说的:C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表 ...

  8. c语言无符号扩展,深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  9. plc位、字节、字、双字、有符号、无符号数据类型的关系

    plc位.字节.字.双字.有符号.无符号的关系 以下内容由深圳市综科智控科技开发有限公司编辑整理 2021/08/18 前言:很多同学在PLC开发过程中,因为数据类型选择错误而出现得到的数据和期望的数 ...

最新文章

  1. ios(iphone/ipad)一个简单的用代码判断当前设备的方法
  2. WINDOWS SERVER 2003 之域重命名
  3. 新手学JAVA(四)----装箱与拆箱
  4. 解决 No module named ‘PyQt5.QtWebEngineWidgets‘
  5. 任务导向型对话系统——对话管理模型研究最新进展
  6. SAP UI5 Repository and MongoDB Repository
  7. java ranger rest_使用REST
  8. C++ static关键字
  9. asp.net mvc3 利用Ajax实现局部刷新
  10. Telegram传奇:俄罗斯富豪、黑客高手、极权和阴谋
  11. Notepad++搜索结果窗找不见了
  12. Oracle 数据库中的 时间 时区
  13. H桥SPWM波产生电路及死区电路的分析
  14. 用计算机计算汉坦,在学习时,虽然也遇到过稍微复杂的数学问题、物理问题,但多数情况下是把类似的例题拿来照搬。这指的是( )思维定势。...
  15. 控制系统仿真技术(二)-连续系统的数字仿真二
  16. DELL笔记本拆机添加内存条
  17. 国际金融2019尔雅满分答案
  18. 中移路由怎么调虚拟服务器,用手机怎么设置中移禹路由器?
  19. Altium Designer 19 生成钢网文件
  20. OEA框架学习:缓存

热门文章

  1. 高等数学中必须掌握的基础知识(一)
  2. “有电才‘型’2013主流智能手机耐力挑战赛” 挑战者七:联想P780
  3. IDEA中Sources、JavaDocs路径是红色的
  4. 炎炎夏日,漂流去哪漂?评论情感分析告诉你
  5. horizo虚拟机_Black Horizo​​n Studios的Will Shaw访谈
  6. CSS3学习笔记(九)——UI元素状态伪类选择器 :checked
  7. PSPad css编辑工具
  8. 网络协议常见问题解答。
  9. 蜂巢输入法android,讯飞输入法首创云+端“蜂巢”输入模型
  10. 分享几款优秀的虚拟机软件,总有一款适合你