关于C数据类型和常量的问题

时间:2011-03-22 18:29:50

标签: c variables integer constants

问候! 我正在尝试使用C语言,直到遇到一些非常奇怪的事情。 我无法解释下面显示的结果。

守则:

#include <stdio.h>

int main(void)
{
    int num = 4294967295U;
    printf("%u\n", num);
    return 0;
}

问题:

1。)如你所见,我创建了一个int,可以在 -2147483648 2147483647 之间保存数字。

2.。)当我将值 4294967295 分配给此变量时,IDE会在编译期间显示一条警告消息,因为变量已溢出。

3。)由于好奇,我在数字后面加了一个 U(无符号),当我重新编译它时,编译器没有返回任何警告信息。

4.)我通过将 U(无符号)更改为 L(长) LL(long long)进行了进一步的实验。正如预期的那样,警告消息仍然存在于这两个但不是在我将其更改为 UL(无符号长) ULL(无符号长长)之后。

5.。)为什么会这样?

警告讯息:(对于步骤2)

warning #2073: Overflow in converting constant expression from 'long long int' to 'int'.

警告讯息:(对于步骤4 LL &amp; L

warning #2073: Overflow in converting constant expression from 'long long int' to 'long int'.

最后,感谢您阅读我的问题,非常感谢您的教导和建议。

2 个答案:

答案 0 :(得分:6)

根据ISO C99标准,第6.4.4.1节(整数常量),小节语义,整数常量的类型是下表的第一种类型值可以表示的地方:

                                    Octal or Hexadecimal
Suffix            Decimal Constant            Constant
none         int                    int
             long int               unsigned int
             long long int          long int
                                    unsigned long int
                                    long long int
                                    unsigned long long int

u or U       unsigned int           unsigned int
             unsigned long int      unsigned long int
             unsigned long long int unsigned long long int

l or L       long int               long int
             long long int          unsigned long int
                                    long long int
                                    unsigned long long int

both u or U  unsigned long int      unsigned long int
and l or L   unsigned long long int unsigned long long int

ll or LL     long long int          long long int
                                    unsigned long long int

both u or U  unsigned long long int unsigned long long int
and ll or LL

特定实现可以具有遵循与上述相同模式的扩展整数类型。

答案 1 :(得分:4)

也许,默认情况下,编译器假定您输入的是有符号整数。当你给它4294967295时,这个数字不适合4字节的整数,所以它使用一个8字节的整数来存储它。然后它必须进行有损转换(long long,AKA 8字节,到long,AKA 4字节),所以它会给你一个警告。

但是,当您键入4294967295U时,它知道您需要无符号整数。该数字适合4字节无符号整数,因此它具有类型long int,并且不需要有损转换。 (您从unsigned long int转到long int并没有丢失数据,只是错误地代表它。)