我可以将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中。
如果int
或unsigned 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; }