c++ - C/C++ 中 unsigned 关键字的混淆

标签 c++ c

考虑以下两个 C 程序。我的问题是第一个程序 unsigned 关键字打印 -12 但我认为它应该打印 4294967284 但它不会打印 % d 说明符。它为 %u 说明符打印它。但是如果我们看第二个程序,输出是 144 而它应该是 -112unsigned 关键字有些可疑,我没有得到。有帮助的 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;

-12int 类型。初始化隐式将该值从 int 转换为 unsigned int。转换后的值(为正且非常大)存储在 i 中。如果 intunsigned int 是 32 位,则存储的值将是 4294967284 (232-12)。

printf(" i = %d\n",i);

iunsigned 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位字节,ab设置为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/

相关文章:

c++ - UE4中如何将FText转为float

c++ - 看起来几乎相同但使用一些不同数据和函数的多个类

c++ - 测试 mini Matrix ADT 时的核心转储

c++ - std::runtime_error: resolve: 在 boost::asio 中找不到主机(权威)

c - ANSI C : If a function pointer points to executable code does that mean less execution overhead than simply invoking the function?

c++ - ffmpeg + glfwGetTime()

c - 低级 printf

c - C 中的格式化矩阵

c - 将非 BMP 代码点写入控制台

c - 修改 PHP rand 函数