年少的梦想 发表于 2020-3-20 17:47:24

简单的数据问题

        Type = sizeof(int);
        i = Type * 8;
        j = pow(2,32);
        printf("%d\n",j);

//不知道为什么问题求助的代码块用不了,所以将就看一下吧
问题是这样的,pow(2,32)的值为2147483647,而pow(2,i)的值为-2147483648,调试过了,i 的值为32,int的字节为4位;

小笨笨难得糊涂 发表于 2020-3-20 17:47:25

int是有符号的
范围是从 -2^31 到2^31-1
因此要除以2
min_int = pow(2, sizeof(int) * 8) / 2 * (-1);
max_int = pow(2, sizeof(int) * 8) / 2 - 1;

如果你定义的的无符号整型 unsigned int
范围就从0到2^32-1
min_int =0;
max_int = pow(2, sizeof(int) * 8)- 1;

sunrise085 发表于 2020-3-20 18:19:42

pow(2,32)使用%d输出?不是已经溢出了么?怎么可能输出正确的结果?

年少的梦想 发表于 2020-3-20 19:06:46

sunrise085 发表于 2020-3-20 18:19
pow(2,32)使用%d输出?不是已经溢出了么?怎么可能输出正确的结果?

抱歉,之前打错了,我这个计算机int是4个字节,即32位,32位就可以装2的32次方,%d打印int型,作业要求是不使用头文件来达到测量int的范围,所以我想到使用sizeof这个运算符,

人造人 发表于 2020-3-20 19:47:38

年少的梦想 发表于 2020-3-20 19:06
抱歉,之前打错了,我这个计算机int是4个字节,即32位,32位就可以装2的32次方,%d打印int型,作业要求是 ...

#include <stdio.h>
#include <math.h>

int main(void)
{
        printf("%ld\n", (long)pow(2, sizeof(int) * 8));
        return 0;
}

年少的梦想 发表于 2020-3-20 20:03:48

人造人 发表于 2020-3-20 19:47


谢谢,但我刚刚忍不住看了小甲鱼的答案,小甲鱼计算的数据范围是这样的const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;
      const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);话说为什么要除2呢?

sunrise085 发表于 2020-3-20 20:04:19

年少的梦想 发表于 2020-3-20 19:06
抱歉,之前打错了,我这个计算机int是4个字节,即32位,32位就可以装2的32次方,%d打印int型,作业要求是 ...

谁告诉你32位能装下2的32次方的?最大值是2的32次方-1

年少的梦想 发表于 2020-3-20 20:06:43

sunrise085 发表于 2020-3-20 20:04
谁告诉你32位能装下2的32次方的?最大值是2的32次方-1

尴尬,突然想到了,是因为补码吧,谢谢了

bin554385863 发表于 2020-3-20 23:56:05

假设int占4位32字节,
最高字节用来做符号位
最高字节0代表正数,1代表负数
因此int最小值为负(2的31次方);
抛去0,最大值为2的31次方-1;

magicpower 发表于 2020-3-21 02:20:28

如果想知道的更具体,去看深入理解计算机系统这本书,前几页有说补码的问题

年少的梦想 发表于 2020-3-21 09:52:53

magicpower 发表于 2020-3-21 02:20
如果想知道的更具体,去看深入理解计算机系统这本书,前几页有说补码的问题

好的,谢谢了,我明白了
页: [1]
查看完整版本: 简单的数据问题