C程序中隐藏的数据溢出陷阱
C程序中隐藏的数据溢出陷阱通常的规则 当代码中对char、short等更短的类型进行算术运算时编译器会自动将它们提升为int再进行计算。假设16位、32位无符号数类型分别定义为UINT16、UNIT32一.计算过程溢出对16bit机器如以下程序UINT16 a, b, c;c (a * b)/10;故障描述当a6554b 10但c出错(6554*10)/10 ! 6554原因分析a * b 65540按unsigned int为16bit计算已溢出解决方案c ((UNIT32)a * b)/10; //手动提升a到32bit二.移植后溢出1. 16位机器正常运行设计如下程序 在主循环中运行10次处理某件事1次UINT16 a0, a00;a;//记录运行次数a达到0xffff后1溢出为0if((a-a0) 10){a0 a;//记录当前时刻//处理其它逻辑}当a065530,a4a当前65530经过10次运行变成4时处理事情在程序中UINT16就是本机字长直接处理不提升那么a-a0 4-65530 −65526 10在无符号整数运算中结果的溢出遵循模2的16次方回绕规则2. 移植到32位机器不能正常运行故障描述在a溢出返回0后程序异常原因分析(a-a0)提升为32位有符号数int−65526在范围内不会转换-65526 10不成立解决方案if((UNIT16)(a-a0) 10)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419577.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!