我弄错了“C”语言的符号值

I get wrong and signed value in 'C' language

提问人:Himanshu Singh 提问时间:6/19/2022 最后编辑:mkrieger1Himanshu Singh 更新时间:6/19/2022 访问量:253

问:

我正在使用 Turbo C++。

这是代码:

#include<stdio.h>
#include<conio.h>
void main()
{
 clrscr();
 
 printf("%d",1000*100);
 printf("\n%d",1000*10);

 getch();
}

输出:

-31072
10000
  1. 为什么第一个给出错误和签名的值?整数是否具有范围(-2147483648 到 +2147483647)。printf()

  2. 其次,它用正确的符号给出正确的价值。如何?printf()

C Turbo-C++

评论

5赞 pmg 6/19/2022
用 和 求出 s 的范围int#include <limits.h>printf("ints range from %d to %d on this implementation.\n", INT_MIN, INT_MAX);
0赞 Kolodez 6/19/2022
写例总是更好 那么你当然知道传递给哪个对象类型。此外,当您要分配的常量太大时,您会遇到编译器错误。int number = 1000*100; printf (... number ...);printfnumber
3赞 n. m. could be an AI 6/19/2022
“我正在使用 Turbo C++”。这就是问题所在。
2赞 phuclv 6/19/2022
1)Turbo C++于1990年发布,比第一个C++标准(C++98)要早得多,因此它不编译符合C++的代码。Turbo C 也比第一个 C 标准更古老。2)C和C++是非常不同的语言,因此Turbo C++不编译C代码。3)Turbo C和Turbo C++是16位DOS程序,int只有16位
1赞 pmg 6/19/2022
使用 TurboC 启动了我的 VM :-)i2.paste.pics/fc6f4d1ce9bec7bb2e0f6533ffa52e94.pngi2.paste.pics/1ebb3f3d1c5da1a51df4c4d3c926bf84.png

答:

1赞 Luca 6/19/2022 #1

1000*100=100'000。如果 u 的长度为 16 位,则结果高于支持的最大值,即 32'767。如果您运行的是 32 位操作系统或正在制作 32 位程序,请考虑使用“long”,对于 32 位操作系统,它是 4 个字节,对于 64 位操作系统,它是 8 个字节;支持的最高值分别为:2'147'483'647、9'223'372'036'854'775'807。 若要将 a 作为输出,请使用以下格式说明符之一:或 。 要查看 的最大值,请包含并检查(请参阅最后一个源)。intlong%l%ld%liintlimits.h

希望它有所帮助。

来源:

评论

1赞 Andreas Wenzel 6/19/2022
“考虑使用”long“,对于 32 位操作系统,它是 4 个字节,对于 64 位操作系统,它是 8 个字节;” -- 此语句不适用于所有平台。例如,在 64 位 Windows 上使用 Microsoft 编译器,a is 字节。long4
0赞 Himanshu Singh 6/19/2022
''Luca'先生,我将格式说明符更改为 %ld,但输出是“34464”,它仍然是错误的
0赞 Himanshu Singh 6/19/2022
先生,当我将一个值更改为浮点数并将格式说明符更改为 %f 时,它会给出带有右符号的正确答案。但是为什么当我分配为 int 类型时它没有给出正确的答案。关于 Turboc++ 编译器,它有 (-2147483648 到 +21474483647) 范围的 signed int。那为什么它给出了错误的答案呢?
1赞 pmg 6/19/2022
1000 * 100完全在 ;你需要乘以...或int1000L * 100longlong a = 1000; long b = 100; long c = a * b; printf("%ld * %ld = %ld\n", a, b, c);
-2赞 Kitswas 6/19/2022 #2

您有一个整数溢出

Turbo C/C++ 是一个 16 位编译器。它不用于开发。尽快停止使用它。

该类型可以存储介于 和 之间的值。以下程序演示。int-3276832767

#include<stdio.h>
#include<conio.h>

void main()
{
    int i;
    clrscr();
    for(i = 0; i >= 0; i++);
    printf("%d\n", i); // upper limit of int
    printf("%d\n", i - 1); //lower limit of int
    getch();
}

要获得您想要的答案,您需要将该数字转换为 。long

printf("%d",1000*100);

应该是

printf("%ld", (long)1000*100);

OnlineGDB 上查看它的实际效果。

评论

0赞 pmg 6/19/2022
当达到限制时,使用 调用 Undefined Behaviour。ii++
0赞 Kitswas 6/19/2022
@pmg TurboC 本身是非标准的。
1赞 pmg 6/19/2022
同意。。不过,它主要符合 C89 标准