考虑以下两个 C 程序。我的问题是第一个程序 unsigned
关键字打印 -12
但我认为它应该打印 4294967284
但它不会打印 % d
说明符。它为 %u
说明符打印它。但是如果我们看第二个程序,输出是 144
而它应该是 -112
。 unsigned
关键字有些可疑,我没有得到。有帮助的 friend !
#include <stdio.h>
int main()
{ unsigned int i = -12;
printf(" i = %d\n",i);
printf(" i = %u\n",i);
return 0;
}
上面的 prorgam 我从这个链接得到:Assigning negative numbers to an unsigned int?
#include <stdio.h>
int main(void)
{unsigned char a=200, b=200, c;
c = a+b;
printf("result=%d\n",c);
return 0;
}
最佳答案
每个 printf
格式说明符都需要一个特定类型的参数。 "%d"
需要一个 int
类型的参数; "%u"
需要一个类型为 unsigned int
的参数。传递正确类型的参数完全是您的责任。
unsigned int i = -12;
-12
是 int
类型。初始化隐式将该值从 int
转换为 unsigned int
。转换后的值(为正且非常大)存储在 i
中。如果 int
和 unsigned int
是 32 位,则存储的值将是 4294967284
(232-12)。
printf(" i = %d\n",i);
i
是 unsigned int
类型,但是 "%d"
需要一个 int
参数。该行为未由 C 标准定义。通常,i
中存储的值将被解释为好像它已存储在 int
对象中。在大多数系统上,输出将是 i = -12
—— 但您不应该依赖于此。
printf(" i = %u\n",i);
这将正确打印 i
的值(假设前一个语句的未定义行为没有把事情搞砸)。
对于普通函数,假设您正确调用它们,参数通常会隐式转换为参数的声明类型(如果可以进行此类转换)。对于 variadic 函数,如 printf
,它可以接受不同数量和类型的参数,无法进行此类转换,因为编译器不知道什么类型是预期的。相反,参数接受默认参数提升。如果 int
可以容纳该类型的所有值,则将类型比 int
窄的参数提升为 int
,或者提升为 unsigned int
否则。 float
类型的参数被提升为 double
(这就是为什么 "%f"
适用于 float
和双重
参数)。
规则是这样一个窄无符号类型的参数通常(但不总是)被提升为(有符号)int
。
unsigned char a=200, b=200, c;
假设8位字节,a
和b
设置为200
。
c = a+b;
总和 400
太小,无法放入 unsigned char
中。对于无符号算术和转换,超出范围的结果将减少到类型的范围内。 c
设置为 144
。
printf("result=%d\n",c);
c
的值被提升为int
;即使参数是无符号类型,int
也足以容纳该类型的所有可能值。输出为 result=144
。
关于c++ - C/C++ 中 unsigned 关键字的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24978775/