为什么我得到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。
答案 0 :(得分:3)
如果您的int
或unsigned 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;
}