提问人:Himanshu Singh 提问时间:6/19/2022 最后编辑:mkrieger1Himanshu Singh 更新时间:6/19/2022 访问量:253
我弄错了“C”语言的符号值
I get wrong and signed value in 'C' language
问:
我正在使用 Turbo C++。
这是代码:
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
printf("%d",1000*100);
printf("\n%d",1000*10);
getch();
}
输出:
-31072
10000
为什么第一个给出错误和签名的值?整数是否具有范围(-2147483648 到 +2147483647)。
printf()
其次,它用正确的符号给出正确的价值。如何?
printf()
答:
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 作为输出,请使用以下格式说明符之一:或 。
要查看 的最大值,请包含并检查(请参阅最后一个源)。int
long
%l
%ld
%li
int
limits.h
希望它有所帮助。
来源:
评论
1赞
Andreas Wenzel
6/19/2022
“考虑使用”long“,对于 32 位操作系统,它是 4 个字节,对于 64 位操作系统,它是 8 个字节;” -- 此语句不适用于所有平台。例如,在 64 位 Windows 上使用 Microsoft 编译器,a is 字节。long
4
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
完全在 ;你需要乘以...或int
1000L * 100
long
long 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
-32768
32767
#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。i
i++
0赞
Kitswas
6/19/2022
@pmg TurboC 本身是非标准的。
1赞
pmg
6/19/2022
同意。。不过,它主要符合 C89 标准
评论
int
#include <limits.h>
printf("ints range from %d to %d on this implementation.\n", INT_MIN, INT_MAX);
int number = 1000*100; printf (... number ...);
printf
number