为什么宏INT_MIN要写成-2147483647-1

本文深入解析了计算机中负数表示方式,尤其是整数溢出问题,通过具体实例阐述了-2147483648在不同数据类型下的表示和含义,揭示了计算机如何处理超出整数表示范围的数值,以及由此引发的溢出现象。

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

转自:http://www.cnblogs.com/baiweiguo/archive/2013/01/15/2861286.html

参考 :http://www.hardtoc.com/archives/119

《深入理解计算机系统》在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义

 

  1. #define INT_MAX 2147483647 
  1. #define INT_MIN (-INT_MAX - 1) 

 

源文档 <http://blog.youkuaiyun.com/seizef/article/details/7605010>

 

 

查到了一篇文章http://www.hardtoc.com/archives/119

文中说,-2147483648是一个常量表达式,而不是一个常量。所以-2147483648被理解为一个“-”号和一个常量值2147483648。对于“-”,是对原值补码进行“取反加1”操作。

对于没有后缀的常量,计算机匹配顺序为:

C98 : int, long int, unsigned long int

C99: int, long int, long long int

由于2147483648超出了有符号常量的表示范围,所以变成了unsigned long int或long long int,而写成-2147483647 - 1则可以精确的表示成为32位有符号整数的最小值。

 

如以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13

#include <stdio.h>
#include <limits.h>
#include <float.h>
 
int main(void)
{

          unsigned long int I =-2147483648;  //i的值为2147483648

        if(-2147483648>0)    printf("positive\n");//实际值为+2147483648
       
if(-2147483647-1<0)printf("negative\n");
       
if(INT_MIN==-INT_MIN)printf("equal\n");
       
if(FLT_MIN>0)        printf("floating\n");
 
        return0;
}

 

源文档 <http://www.hardtoc.com/archives/119>

 

由于-2147483648是常量表达式,其中2147483648超出了int、long int的表示范围,故调用unsigned long int类型,即为:

   10000000 00000000 00000000 00000000    :无符号型,表示正数2147483648

则-2147483648,即对上式取反+1,为:

      01111111 11111111 11111111 11111111 + 00000000 00000000 00000000 00000001

 = 10000000 00000000 00000000 00000000 :当做无符型,所以值2147483648

即 I =2147483648;

 

如果令代码为 int I  = -2147483648,则i被强制转换为int型,即10000000 00000000 00000000 00000000 当做有符号,所以值为: -2147483648。

 

结论:计算机中单独的一个“-2147483648”表达式在32位机中实际值为2147483648

 

 

令 int I = 2147483648,溢出int范围,则i的值为 -2147483648   (

2147483648超出了int、long int的表示范围,故调用unsigned long int类型,即为:

   10000000 00000000 00000000 00000000   强制转换成int后二进制位不变,但是解析成int 类型有符号,所以值为: -2147483648

2147483648用unsigned型表示为:

10000000 00000000 00000000 00000000,转换为int后,即为 -2147483648的计算机中补码形式。i的值为-2147483648

 

若int I = -2147483649,则其无符型表示为

10000000 00000000 00000000 00000001,转换为int型为 -2147483647

``` WaveType current_wave = WAVE_UNKNOWN; #define OLED_WIDTH 128 #define OLED_HEIGHT 64 void OLED_Init(void); void OLED_Refresh(void); #define ADC_REF_VOLTAGE 3.3f // ADC???? #define ADC_RESOLUTION 4095 // 12?ADC??? #define SAMPLE_RATE 600000 // ???(Hz) #define HYSTERESIS 50 // ?????? void AnalyzeWaveform(void) { uint16_t filtered_buffer[ADC_BUF_SIZE]; for(int i=1; i<ADC_BUF_SIZE; i++) { filtered_buffer[i] = (adc_buffer[i-1] + adc_buffer[i]) / 2; } uint16_t max = 0, min = 0xFFFF; for(int i=0; i<ADC_BUF_SIZE; i++) { if (filtered_buffer[i] > max) { max = filtered_buffer[i]; } else if (max - filtered_buffer[i] > HYSTERESIS * 10) { max = filtered_buffer[i]; // ???? } if (filtered_buffer[i] < min) { min = filtered_buffer[i]; } else if (filtered_buffer[i] - min > HYSTERESIS * 10) { min = filtered_buffer[i]; // ???? } } vpp = 2*(max - min) * ADC_REF_VOLTAGE / ADC_RESOLUTION; /*---------------------------------- ?????????(?????) ----------------------------------*/ uint32_t sum = 0; for(int i=0; i<ADC_BUF_SIZE; i++) sum += filtered_buffer[i]; uint16_t threshold = sum / ADC_BUF_SIZE; uint16_t crossCount = 0; bool lastState = (filtered_buffer[0] > (threshold + HYSTERESIS)); for(int i=1; i<ADC_BUF_SIZE; i++) { bool currentState = (filtered_buffer[i] > (threshold + HYSTERESIS)) || ((filtered_buffer[i] > (threshold - HYSTERESIS)) && lastState); if(lastState != currentState) { crossCount++; lastState = currentState; } } frequency = (crossCount * SAMPLE_RATE) / (2.0f * ADC_BUF_SIZE); /*---------------------------------- ?????????(?????) ----------------------------------*/ float slope_sum = 0; uint16_t rise_count = 0, fall_count = 0; for(int i=1; i<ADC_BUF_SIZE; i++) { int16_t diff = filtered_buffer[i] - filtered_buffer[i-1]; slope_sum += fabsf((float)diff); // ??????(?????) if(diff > HYSTERESIS) rise_count++; if(diff < -HYSTERESIS) fall_count++; } float avg_slope = slope_sum / ADC_BUF_SIZE; float symmetry = fabsf((float)rise_count - fall_count) / (rise_count + fall_count); // ??????? if (symmetry < 0.1 && avg_slope > 100) { // ??:???? current_wave = WAVE_SQUARE; } else if (symmetry < 0.2 && avg_slope < 30) { // ???:???? current_wave = WAVE_SINE; } else if (symmetry > 0.8) { // ???:????? current_wave = WAVE_SAWTOOTH; } else { // ????? current_wave = WAVE_TRIANGLE; } }```解释代码内容,并优化算法,然后把优化后的代码完整写出来
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值