【问题标题】:Cant i store 4294967295 in unsigned int ? Int is 4 bytes on my machine我不能将 4294967295 存储在 unsigned int 中吗? Int 在我的机器上是 4 个字节
【发布时间】:2016-10-05 17:46:02
【问题描述】:

为什么我得到 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 个字节,我猜想我应该能够将 4294967295 存储在 unsigned int 中。

【问题讨论】:

  • 了解limits.h。不要依赖假设(顺便说一句,你错了)。
  • 你忘记了冰山的另一部分:负数
  • @Jean-FrançoisFabre:冰山有 90% 在水下。有符号整数有一个(n 几乎)对称范围。
  • 对不起,我混淆了签名和未签名
  • 你的问题很困惑。请更正!

标签: c int


【解决方案1】:

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

即使uint32_t 也只能存储最大值2**32 - 1,所以您的值只是1 超出范围。

int32_t 可以存储最大正值2**31 - 1,因此带符号的类型更远。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这不一定是真的。如果 y 字节有 9 位怎么办?还是16?还是有填充位?还是它使用不同的编码?
    • 但是怎么可能签名为负数??
    • 对不起,未签名:(
    • 我是 C 新手
    • 吹毛求疵:这里没有要求使用所有 32 位......也不需要对范围做任何假设,因为实现必须提供这些信息即用型.
    【解决方案3】:

    我很长一段时间后(显然)回到了这个问题,我不确定为什么每个人都认为 OP 意味着存储 4294967296 当他想要存储 4294967295 时,正如问题中所问的那样,也许 OP 改变了问题后来,也没有人费心重新回答。现在,回到问题。

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

    您需要打印使用%u 而不是%d 获得的unsigned 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;
    }
    

    【讨论】:

    • "也许 OP 稍后更改了问题..." 但这是 your 问题,您在收到答案后更改了该问题。为什么有人会“费心”重新审视你是否问错了问题?接受你自己的答案有点过分。
    • @WeatherVane 对不起,然后 stackoverflow 坏了,因为 stackoverflow 说“尝试改进你的问题”,我做到了。其实,问题并没有错,一点也没有,错了就没有答案。而且,正如你所看到的,在这里,我回答了它。所以,如果有人遇到这样的问题,并且看到这个问题与任何其他回答的人的答案,他会完全糊涂。这个答案实际上回答了“新”问题。是的。谢谢你的-1,给正确答案-1。
    • @WeatherVane 而且,随着问题的改变,您和所有其他答案都是“错误的”。所以,我得到 -1 因为我 1. 改进了我的问题 2. 正确回答了新问题。
    • 恕我直言,我认为是您对 SO 的使用被破坏了。改进问题的想法是响应查询和 cmets,以便可以回答。但是在收到原始问题的答案后,将其更改为不同的问题并不是一种改进,因为它会使您收到的所有答案无效。期望评论者跟踪您现在不同的问题并修改他们的答案是不合理的。您应该做的是提出一个新问题:您最初打算提出的问题,可能会提到这个问题,或者先删除这个问题。
    • @WeatherVane 对不起,我太冒犯了。但是,我很沮丧我的帐户被禁止提出我之前提出的愚蠢问题(比如这个),我想改进它们,以便取消禁令。而且,我不能通过问另一个问题来做到这一点,因为我被禁止了,我只能编辑。还有其他解决方案吗?
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2018-10-26
    • 2021-09-15
    相关资源
    最近更新 更多