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:它们肯定不是。它们是不同的类型,可能有不同的含义,例如,对于参数传递!您混合了语言和实现,这是一个坏主意。