为什么int的最小值是-2³¹

本文深入探讨了负数在计算机中的补码表示方式,特别是如何将最大整数减一转化为补码形式,并指出其与最小整数的关系,解释了整数范围的边界。

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

负数的二进制用补码表示,负数的补码是绝对值的原码取反再加1,

而int型的最大的绝对值是2³¹-1,原码为01111111111111111111111111111111,那么-(2³¹-1)的二进制为10000000000000000000000000000001(绝对值原码取反加1)

很明显10000000000000000000000000000000才是32位的最小值,也就是-(2³¹-1)-1,也就是-2³¹

/******************************************************************************* * File Name : adc.c * Author : * Date First Issued : * Description : ********************************************************************************/ #ifndef _ADC_C #define _ADC_C #include "..\header\total_header.h" void adc_init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); } /****************************************************************************************/ //&frac14;ÆËãÑ&sup1;Á¦ /****************************************************************************************/ short temp; short Get_Pressure(void) { while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); // µÈ´ýת»»Íê³É temp = ADC_GetConversionValue(ADC1); if(temp<50) { return 0; } else { return Pressure = (temp - 50)*5000/(4095 - 50); } } uint32_t get_elapsed_time(uint32_t start_cnt1, uint32_t end_cnt1, uint32_t start_ovf1, uint32_t end_ovf1) { return (end_ovf1 - start_ovf1) * 65536 + (end_cnt1 - start_cnt1); } void Collect_Data(short *arr,short *MaxValue,short *MinValue,short *Average_Value,short *Wanning_Flag,uint16_t T) { int i; for(i=0;i<length;i++) { //data[i]=arr[i]; *Average_Value +=arr[i]; } if((*Average_Value) > T) { *Wanning_Flag = 1; } *MaxValue=*MinValue=data[0]; for(i=0;i<length;i++) { if(arr[i]>*MaxValue) { *MaxValue=arr[i]; } if(arr[i]<*MinValue) { *MinValue=arr[i]; } } } //TAP------->Time And Pressure extern int X; void Test_TAP(void) { int i; timer3_init(); timer4_init(); for(i = 0;i<10;i++) { do { start_ovf2 = overflow_count2; start_cnt2 = TIM_GetCounter(TIM4); } while (overflow_count2 != start_ovf2); //--------------------------------------------------------------------- do { start_ovf1 = overflow_count1; start_cnt1 = TIM_GetCounter(TIM3); } while (overflow_count1 != start_ovf1); //-------------------&frac14;ì&sup2;â´úÂëÔËÐÐʱ&frac14;ä---------------------------------- GPIO_ResetBits(GPIOC,GPIO_Pin_13); while(Get_Pressure() == 0);//µÈ´ýÑ&sup1;Á¦&sup2;»ÎªÁãΪÖ&sup1; //Delay_us(100);//µÈ´ýÖµÎȶ¨ //--------------------------------------------------------------------- do { end_ovf1 = overflow_count1; end_cnt1 = TIM_GetCounter(TIM3); } while (overflow_count1 != end_ovf1); elapsed_us1 = get_elapsed_time(start_cnt1, end_cnt1, start_ovf1, end_ovf1); //--------------------------------------------------------------------- arr2[i] = elapsed_us1; Delay_ms(1000/frequency); arr3[i] =Get_Pressure();//»ñÈ¡Ñ&sup1;Á¦Öµ GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000/frequency); //--------------------------------------------------------------------- do { end_ovf2 = overflow_count2; end_cnt2 = TIM_GetCounter(TIM4); } while (overflow_count2 != end_ovf2); elapsed_us2 = get_elapsed_time(start_cnt2, end_cnt2, start_ovf2, end_ovf2); arr1[i] = elapsed_us2-elapsed_us1-200000/frequency+800; } Collect_Data(arr1,&Max_ReturnTime,&Min_ReturnTime,&Average_ReturnTime,&RTW_Flag,8000); Collect_Data(arr2,&Max_HitTime,&Min_HitTime,&Average_HitTime,&HTW_Flag,8000); Collect_Data(arr3,&Max_Pressure,&Min_Pressure,&Average_Pressure,&PW_Flag,20000); X = frequency; } void Change_Frequency(void) { if (frequency > 0 && frequency <= 30)//¿ÉÉèÖÃ0~30µÄƵÂÊ { Test_TAP(); } } #endif 优化代码,把收集的数据放在同一个数组上面
07-09
/******************************************************************************* * File Name : adc.c * Author : * Date First Issued : * Description : ********************************************************************************/ #ifndef _ADC_C #define _ADC_C #include "..\header\total_header.h" void adc_init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); } /****************************************************************************************/ //&frac14;ÆËãÑ&sup1;Á¦ /****************************************************************************************/ short temp; short Get_Pressure(void) { while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); // µÈ´ýת»»Íê³É temp = ADC_GetConversionValue(ADC1); if(temp<50) { return 0; } else { return Pressure = (temp - 50)*5000/(4095 - 50); } } uint32_t get_elapsed_time(uint32_t start_cnt1, uint32_t end_cnt1, uint32_t start_ovf1, uint32_t end_ovf1) { return (end_ovf1 - start_ovf1) * 65536 + (end_cnt1 - start_cnt1); } void Collect_Data(TAP_Data *data, uint16_t length, uint32_t *max_rt, uint32_t *min_rt, uint32_t *avg_rt, uint32_t *max_ht, uint32_t *min_ht, uint32_t *avg_ht, uint16_t *max_p, uint16_t *min_p, uint16_t *avg_p, uint16_t T) { uint32_t sum_rt = 0, sum_ht = 0; uint32_t sum_p = 0; *max_rt = *min_rt = data[0].return_time; *max_ht = *min_ht = data[0].hit_time; *max_p = *min_p = data[0].pressure; for(int i = 0; i < length; i++) { if(data[i].return_time > *max_rt) *max_rt = data[i].return_time; if(data[i].return_time < *min_rt) *min_rt = data[i].return_time; sum_rt += data[i].return_time; if(data[i].hit_time > *max_ht) *max_ht = data[i].hit_time; if(data[i].hit_time < *min_ht) *min_ht = data[i].hit_time; sum_ht += data[i].hit_time; if(data[i].pressure > *max_p) *max_p = data[i].pressure; if(data[i].pressure < *min_p) *min_p = data[i].pressure; sum_p += data[i].pressure; } *avg_rt = sum_rt / length; *avg_ht = sum_ht / length; *avg_p = sum_p / length; } //TAP------->Time And Pressure extern int X; void Test_TAP(void) { int i; timer3_init(); timer4_init(); for(i = 0;i<10;i++) { do { start_ovf2 = overflow_count2; start_cnt2 = TIM_GetCounter(TIM4); } while (overflow_count2 != start_ovf2); //--------------------------------------------------------------------- do { start_ovf1 = overflow_count1; start_cnt1 = TIM_GetCounter(TIM3); } while (overflow_count1 != start_ovf1); //-------------------&frac14;ì&sup2;â´úÂëÔËÐÐʱ&frac14;ä---------------------------------- GPIO_ResetBits(GPIOC,GPIO_Pin_13); while(Get_Pressure() == 0);//µÈ´ýÑ&sup1;Á¦&sup2;»ÎªÁãΪÖ&sup1; //Delay_us(100);//µÈ´ýÖµÎȶ¨ //--------------------------------------------------------------------- do { end_ovf1 = overflow_count1; end_cnt1 = TIM_GetCounter(TIM3); } while (overflow_count1 != end_ovf1); elapsed_us1 = get_elapsed_time(start_cnt1, end_cnt1, start_ovf1, end_ovf1); //--------------------------------------------------------------------- data_assemble[i].hit_time = elapsed_us1;//»ñÈ¡»÷´òʱ&frac14;ä Delay_ms(1000/frequency); data_assemble[i].pressure = Get_Pressure();//»ñÈ¡Ñ&sup1;Á¦Öµ GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000/frequency); //--------------------------------------------------------------------- do { end_ovf2 = overflow_count2; end_cnt2 = TIM_GetCounter(TIM4); } while (overflow_count2 != end_ovf2); elapsed_us2 = get_elapsed_time(start_cnt2, end_cnt2, start_ovf2, end_ovf2); data_assemble[i].return_time = elapsed_us2-elapsed_us1-200000/frequency+800;//»ñÈ¡»÷·µ»ØÊ±&frac14;ä } // Collect_Data(arr1,&Max_ReturnTime,&Min_ReturnTime,&Average_ReturnTime,&RTW_Flag,8000); // Collect_Data(arr2,&Max_HitTime,&Min_HitTime,&Average_HitTime,&HTW_Flag,8000); // Collect_Data(arr3,&Max_Pressure,&Min_Pressure,&Average_Pressure,&PW_Flag,20000); Collect_Data(tap_data, DATA_LENGTH, &Max_ReturnTime, &Min_ReturnTime, &Average_ReturnTime, &Max_HitTime, &Min_HitTime, &Average_HitTime, &Max_Pressure, &Min_Pressure, &Average_Pressure, 8000); RTW_Flag = (Average_ReturnTime > 8000) ? 1 : 0; HTW_Flag = (Average_HitTime > 8000) ? 1 : 0; PW_Flag = (Average_Pressure > 20000) ? 1 : 0; X = frequency; } void Change_Frequency(void) { if (frequency > 0 && frequency <= 30)//¿ÉÉèÖÃ0~30µÄƵÂÊ { Test_TAP(); } } #endif 检查上述代码
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值