问候! 我正在尝试使用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'.
最后,感谢您阅读我的问题,非常感谢您的教导和建议。
答案 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
并没有丢失数据,只是错误地代表它。)