我可以将4294967295存储在unsigned int中吗? Int在我的机器上是4个字节

时间:2016-10-05 17:46:03

标签: c int

为什么我得到0?和编译器警告:

  

格式'%d'需要类型为'int'的参数,但参数3的类型为'long unsigned int'

以下是代码:

#include <stdio.h>

//function declerations...
int power(int base, int on);

int main(void) {
    printf("%d",power(2, sizeof(int)*8)-1);
    return 0;
}

int power(int base, int on) {
    int pf = 1;
    for (int i = 0; i < on; i++) {
        pf *= base;
    }
    return pf;
}

如果int在我的系统上是4个字节,我猜测我应该能够在无符号 int中存储4294967295。

3 个答案:

答案 0 :(得分:3)

如果您的intunsigned int是32位,则两者都不能存储值4294967296,因为这是2**32,这需要64位类型。

即使uint32_t也只能存储最大值2**32 - 1,因此您的值只有1超出范围。

int32_t可以存储最大正值2**31 - 1,因此签名类型更进一步。

答案 1 :(得分:2)

假设int为4个字节且您有8位字节,则int为32位宽。随后signed int(如果负数以2的补码表示)的范围为-2147483648至2147483647,而unsigned int的范围为0至4294967295。

二进制值4294967296为1 00000000 00000000 00000000 00000000。这是33位。所以4294967296对于这种类型来说太大了。

答案 2 :(得分:0)

我很久(显然)回到这个问题,我不确定为什么每个人都认为OP意味着存储4294967296时他想要存储问题中提到的4294967295,也许OP后来改变了这个问题,没有人费心去重新回答。现在,回到问题。

您可以将4294967295存储在unsigned int,但问题出在您的打印中,您正在执行printf("%d", 4294967295),这意味着将4294967295打印为signed int,但4294967295号码无法存储在signed int中,因此会缩小转化率。

您需要使用unsigned int打印%u而不是%d

#include <stdio.h>

int power(int base, int pow);

int main(){
  printf("Size of unsigned int: %d\n", sizeof(unsigned int));
  unsigned int the_number = power(2, sizeof(int)*8)-1;
  printf("Wrongly printed: %d\n", the_number);
  printf("Correctly printed: %u\n", the_number);
  return 0;
}

int power(int base, int on) {
    int pf = 1;
    for (int i = 0; i < on; i++) {
        pf *= base;
    }
    return pf;
}