C 我不能以未签名整数存储4294967295吗?Int在我的机器上是4个字节
为什么我得到0??和编译器警告: 格式“%d”要求参数类型为“int”,但参数3的类型为“long unsigned int” 代码如下:C 我不能以未签名整数存储4294967295吗?Int在我的机器上是4个字节,c,int,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,
#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-power(int-base,int-on);
内部主(空){
printf(“%d”,功率(2,sizeof(int)*8)-1);
返回0;
}
整数功率(整数基,整数开){
int-pf=1;
for(int i=0;i
如果在我的系统上int是4字节,我猜我应该能够在无符号的int中存储4294967295。假设
int是4字节,你有8位字节,那么int
是32位宽。随后,有符号整数
(如果2的补码表示负数)的范围为-2147483648到2147483647,而无符号整数
的范围为0到4294967295
二进制中的值4294967296是1000000000000000000000000
。这是33位。因此4294967296对于这种类型来说太大了。如果int
或无符号int
为32位,则两者都不能存储值4294967296
,因为这是2**32
,需要64位类型
即使uint32\u t
也只能存储最大值2**32-1
,因此您的值超出范围
但是int32_t
可以存储最大正值2**31-1
,因此签名类型更加离谱。很长一段时间后(显然)我又回到了这个问题上,我不确定为什么每个人都认为OP在想存储问题中提到的4294967295
时,应该存储4294967296
,也许OP后来改变了问题,没有人愿意重新回答。现在,回到问题上来
您可以将4294967295
存储在unsigned int
中,但问题在于打印时,您正在执行printf(“%d”,4294967295)
,这意味着将4294967295
打印为signed int
,但编号4294967295
无法存储在signed int
中,因此,缩小转换发生
您需要打印使用%u
而不是%d
获得的无符号int
#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;
}
#包括
整数功率(整数基、整数功率);
int main(){
printf(“无符号整数的大小:%d\n”,sizeof(无符号整数));
无符号整数=幂(2,sizeof(int)*8)-1;
printf(“打印错误:%d\n”,即\u编号);
printf(“正确打印:%u\n”,即\u编号);
返回0;
}
整数功率(整数基,整数开){
int-pf=1;
for(int i=0;i
了解限制.h
。不要依赖假设(顺便说一句,你错了)。你忘记了冰山的另一部分:消极numbers@Jean-弗朗索瓦·法布:一座冰山90%都在水下。有符号整数有一个(n)几乎对称的范围。很抱歉,我把有符号和无符号弄混了。你的问题很混乱。请改正它!这不一定是真的。如果y字节有9位呢?还是16岁?还是有填充位?或者它使用不同的编码?但怎么可能有符号是负数?对不起,无符号:(我刚刚接触CNit pick:这里不要求使用所有32位…也不需要对范围做任何假设,因为实现必须提供这些信息以备使用。“也许OP稍后改变了问题…”但这是你的问题,在收到答案后你就改变了。为什么有人会“费心”重新审视你是否提出了错误的问题?接受你自己的答案有点难。@WeatherVane对不起,那么stackoverflow被打破了,正如stackoverflow所说的“尝试改进你的问题”,我回答了。事实上,这个问题没有错,一点也没有,如果它错了,它就不会有答案。你们可以看到,在这里,我回答了它。所以,如果有人遇到这样的问题,看到这个问题和其他人的答案,他会完全困惑。这个答案实际上回答了“新的”问题。所以,是的。谢谢-1,给正确答案打-1。@风向标,随着问题的改变,你和所有其他答案都是“错误的”因此,我得到-1是因为我1.改进了我的问题2.正确回答了新问题。恕我直言,我认为这是你对So的使用被打破了。改进问题的想法,是为了回应提问和评论,以便能够得到答案。但在收到原始问题的答案后,将其改为其他问题并不是一种改进因为它使您收到的所有答案无效。期望评论者跟踪您现在不同的问题并修改他们的答案是不合理的。您应该做的是提出一个新问题:您最初打算提出的问题,可能是参考此问题,或者先删除此问题。@WeatherVane Im s太无礼了,我很抱歉。但是,我很沮丧,我的帐户被禁止问我之前问过的愚蠢问题(比如这个),我想改进它们,以便取消禁令。而且,我不能问另一个问题,因为我被禁止,我只能编辑。还有其他解决方案吗?