C语言 int 临界值的一些情况

#include<iostream>
using namespace std;
int main()
{
    int a=2147483647;
    unsigned int d=2747483647;
    unsigned int e=2147483648;
    //if(a>b)cout<<1<<endl;  //不优化
    if(2147483647>-2147483648)cout<<"2147483647>-2147483648"<<endl;
    else cout<<"2147483647<=-2147483648"<<endl;
    if(2147483647>-2147483649)cout<<"2147483647>-2147483649"<<endl;
    else if(2147483647==-2147483649)cout<<"2147483647=-2147483649"<<endl;
    else cout<<"2147483647<-2147483649"<<endl;
    if(2147483647>-2147483650)cout<<"2147483647>-2147483650"<<endl;
    else cout<<"2147483647<=-2147483650"<<endl;
    return 0;                                   
}

执行结果:
2147483647<=-2147483648
2147483647=-2147483649
2147483647>-2147483650
请按任意键继续. . .

可以看到黄色部分是反常的,下面给出解析

if 中的整数,编译器默认是int型
48 49(正数+2147483648,49)溢出了,会被优化成无符号,这时数字前的负号会
对无符号2147483648的机器码取反加一,然后才存入内存!!!
注意,从机器码层面才能解释!

48加负号——10…0 取反加一还是10…00——无符号数表示为2147483648
49加负号——10…1取反加一为011…11——无符号数表示为2147483647
50加负号——10…0010取反加一为01…10——无符号数表示为2147483646

PS:如果是已经声明好的变量的话,编译器是不会自动优化的

#include<iostream>
using namespace std;
int main()
{
    int a=2147483647;
    int b=-2147483648;
    if(a>b)cout<<"2147483647>-2147483648"<<endl;
    else cout<<"2147483647<=-2147483648"<<endl;
    return 0;                                   
}

执行结果:
2147483647>-2147483648
请按任意键继续. . .

可以看到,并没有反常现象出现

原因是,已经声明了的int型的变量b 不会自动优化成无符号数
在这里插入图片描述

而是仍然按照int型的溢出规则——一旦溢出则加或减2的32次方
下面来看:

#include<iostream>
using namespace std;
int main()
{
    int a=2147483647;
    int b=-2147483648;
    int c=-2147483649;
    if(a>b)cout<<"2147483647>-2147483648"<<endl;
    else cout<<"2147483647<=-2147483648"<<endl;
    if(a>c)cout<<"2147483647>-2147483649"<<endl;
    else if(a==c)cout<<"2147483647=-2147483649"<<endl;
    else cout<<"2147483647<-2147483649"<<endl;
    return 0;                                   
}

运行结果:
2147483647>-2147483648
2147483647=-2147483649
请按任意键继续. . .

解析:
b=-2147483649 是负下溢,即超出了int能表示的负数的范围,此时
变量b经过溢出规则处理后的值为:-2147483649+2的32次方=2147483647

以上就结束啦!

下面附上溢出处理的文章:
溢出处理规则

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡方检验是一种常用的假设检验方法,用于检验两个变量之间是否存在相关性。下面是C语言实现100个数的卡方检验的示例代码: ```c #include <stdio.h> #include <math.h> #define N 100 // 样本数量 #define M 10 // 分组数量 #define alpha 0.05 // 显著性水平 int main() { int a[N] = { 23, 14, 8, 6, 9, 10, 11, 7, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; double f[M] = { 0 }; double e[M] = { 0 }; double chi2 = 0; int i; // 计算每个分组的期望值 for (i = 0; i < M; i++) { e[i] = N / M; } // 计算每个分组的实际值 for (i = 0; i < N; i++) { f[i / (N / M)] += a[i]; } // 计算卡方值 for (i = 0; i < M; i++) { chi2 += pow(f[i] - e[i], 2) / e[i]; } // 计算自由度 int df = M - 1; // 查表得到临界值 double critical_value = 16.919; // 判断是否拒绝原假设 if (chi2 > critical_value) { printf("拒绝原假设\n"); } else { printf("接受原假设\n"); } return 0; } ``` 在上面的代码中,我们使用了一个长度为`N`的数组`a`来存储样本数据,使用一个长度为`M`的数组`f`来存储分组后的实际值,使用一个长度为`M`的数组`e`来存储分组后的期望值。我们首先计算每个分组的期望值,然后计算每个分组的实际值,最后计算卡方值并判断是否拒绝原假设。 在这个示例中,我们使用了固定的样本数据和分组数量,实际应用中需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值