Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我不能以未签名整数存储4294967295吗?Int在我的机器上是4个字节_C_Int - Fatal编程技术网

C 我不能以未签名整数存储4294967295吗?Int在我的机器上是4个字节

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,

为什么我得到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-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太无礼了,我很抱歉。但是,我很沮丧,我的帐户被禁止问我之前问过的愚蠢问题(比如这个),我想改进它们,以便取消禁令。而且,我不能问另一个问题,因为我被禁止,我只能编辑。还有其他解决方案吗?