c语言中Long(修饰语)的声明
我这里有一段代码:c语言中Long(修饰语)的声明,c,C,我这里有一段代码: unsigned long int a =100000; int a =100000UL; 我怀疑上面两行是否代表同一件事???长int和int不一定相同,但它们可能是相同的。未签名和已签名不是一回事。数值常量可以表示相同的值而不是相同的东西,如100000和100000UL(前者是有符号的int,后者是无符号的long)根据*运算符的两个操作数进行算术,它们是50000和1024000。每一个都适合32位int,因此计算按int-进行,结果将是51200000000,但这
unsigned long int a =100000;
int a =100000UL;
我怀疑上面两行是否代表同一件事???长int和int不一定相同,但它们可能是相同的。未签名和已签名不是一回事。数值常量可以表示相同的值而不是相同的东西,如100000和100000UL(前者是有符号的int,后者是无符号的long)根据
*
运算符的两个操作数进行算术,它们是50000
和1024000
。每一个都适合32位int
,因此计算按int
-进行,结果将是51200000000
,但这至少需要36位来表示值,因此您有32位算术溢出,结果是未定义的行为
算术完成后,int
结果将转换为64位long
——而不是之前
编译器发出警告是正确的,因为您调用了未定义的行为,所以打印的任何内容都是“正确的”
要修复代码,您可以编写:
#include <stdio.h>
int main(void)
{
long x = 50000L * 1024000L;
printf("%ld\n", x);
return 0;
}
#包括
内部主(空)
{
长x=50000L*1024000L;
printf(“%ld\n”,x);
返回0;
}
严格地说,您只需要两个
L
后缀中的一个,但对称性建议同时使用这两个后缀。如果愿意,可以使用一个或两个(long)
强制转换。如果愿意,您也可以节省空间,但它们有助于代码的可读性。C没有修饰符。什么意思?为什么你认为两种不同的类型代表同一件事?提供一个。回滚。您不能编辑问题,留下没有上下文的答案!这不是讨论/现场编辑网站。unsigned long int
和int
绝不是一回事。即使long
和int
的宽度相同,它们也不是!那么UL代表什么呢in@Olaf:4字节整数和4字节长整数在这个意义上是相同的。但是是的,我注意到它们不一定是一样的。真的没什么好争论的。没有建议将它们视为同一事物。如我所说,文字末尾的UL表示无符号长字符。@L.ScottJohnson:它们肯定不是。它们是不同的类型,可能有不同的含义,例如,对于参数传递!您混合了语言和实现,这是一个坏主意。