uint32_t相减的abs

本文探讨了在C++中使用abs函数处理uint32_t类型数据时可能遇到的问题。直接对uint32_t类型的数据使用abs函数会导致错误,正确的做法是先将数据转换为int类型再进行操作。这一细节对于理解C++类型转换和标准库函数的使用至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uint32_t a;
uint32_t b;
cout << abs(a-b) << endl; //会出错
cout << abs(int(a-b)) << endl; //对了

MM32F0163项目,新建一个查表法的表单,以下是我相关程序#define WADC_0MM 2589 #define WADC_1MM 2542 #define WADC_2MM 2495 #define WADC_16MM 1851 #define WADC_17MM 1795 #define WADC_18MM 1731 #define MIN_ADC WADC_18MM #define MAX_ADC WADC_0MM const uint16_t W_seg_points[SEGMENTS+1][2]= //jerry多点标定 { {WADC_0MM,50}, //x1,y1(5%占空比) 0mm {WADC_1MM,95}, //x2,y2(9.5%占空比) 1mm {WADC_2MM,140}, //x3,y3(14.0%占空比) 2mm {WADC_16MM,770}, //x4,y4(77.0%占空比) 16mm {WADC_17MM,815}, //x5,y5(81.5%占空比) 17mm {WADC_18MM,860}, //x6,y6(86.0%占空比) 18mm }; uint16_t W_pwm_lookup_table[MAX_ADC-MIN_ADC+1]; void InitLookupTable_W() { for(uint8_t seg=0; seg<SEGMENTS; seg++) { uint16_t x_start = W_seg_points[seg][0]; uint16_t x_end = W_seg_points[seg+1][0]; uint16_t y_start = W_seg_points[seg][1]; uint16_t y_end = W_seg_points[seg+1][1]; int32_t delta_x = (int32_t)x_end - x_start; int32_t step = (delta_x > 0) ? 1 : -1; uint32_t iterations = abs(delta_x); for(uint32_t i=0; i<=iterations; i++) { uint32_t x = x_start + i*step; // 带符号的精确计算 int32_t numerator = (int32_t)(x - x_start) * (y_end - y_start); int32_t denominator = delta_x; int32_t rounded = (numerator + (denominator / 2)) / denominator; // 正负通用 uint16_t y = y_start + (uint16_t)rounded; // 计算数组偏移量 uint32_t idx = x - MIN_ADC; if(idx <= (MAX_ADC - MIN_ADC)) { W_pwm_lookup_table[idx] = y; } printf("x=%d, y_calc=%d, y_expected=%.1f\r\n", x, y, y_start + (x - x_start)*(float)(y_end - y_start)/((int32_t)x_end - (int32_t)x_start)); } } }这是相关函数,然后是主函数初始化,然后调用相关语句如下 InitLookupTable_W();// 初始化查找表 WcompareValue=W_pwm_lookup_table[ch7_median];程序的问题是:当我变量ch7_median值为WADC_XMM跟WADC_(X+1)MM中间的一个值时,W_pwm_lookup_table[]输出的不是这中间的一个值,而是定义的端点值,通过打印串口数据,数据如下: x=2589, y_calc=50, y_expected=50.0 x=2588, y_calc=51, y_expected=-4112202752.0 x=2587, y_calc=52, y_expected=-4112202752.0 x=2586, y_calc=53, y_expected=-4112202752.0 x=2585, y_calc=54, y_expected=-4112202752.0 x=2584, y_calc=55, y_expected=-4112202752.0 x=2583, y_calc=56, y_expected=-4112202752.0 … x=2542, y_calc=95, y_expected=-4112202752.0 x=2542, y_calc=95, y_expected=95.0 x=2541, y_calc=96, y_expected=-4112202752.0 … x=2495, y_calc=140, y_expected=-4112202752.0 x=2495, y_calc=140, y_expected=140.0 x=2494, y_calc=141, y_expected=-4201598208.0 … x=1851, y_calc=770, y_expected=-4201597440.0 x=1851, y_calc=770, y_expected=770.0 x=1850, y_calc=771, y_expected=-3451312128.0 … x=1795, y_calc=815, y_expected=-3451312128.0 x=1795, y_calc=815, y_expected=815.0 x=1794, y_calc=816, y_expected=-3019898112.0 …
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值