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

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

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

这是代码:

#include  //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个字节,我我应该能够将4294967295存储在unsigned int中。

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

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

int32_t可以存储最大正值2**31 - 1因此签名类型甚至更远。

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

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

很长一段时间(显然)我回到这个问题,我不知道为什么每个人都认为OP意味着存储4294967296当他想要存储问题中的4294967296时,也许OP后来改变了问题,没有人费心去做再回答。 现在,回到问题。

您可以将4294967295存储在unsigned int ,但问题出在您的打印中,您正在执行printf("%d", 4294967295) ,这意味着将4294967295打印为signed int ,但是数字4294967295不能存储在signed int ,因此,缩小转换发生。

你需要打印你用%u而不是%d得到的unsigned int

 #include  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; }