|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:0. 填充下边代码,使得打印结果为:-1 和 255。
鱼老师给的答案是这样的,
#include <stdio.h>
int main()
{
signed char i;
unsigned char j;
i = 255;
j = 255;
printf("signed char = %hhd\n",i);
printf("unsigned char = %hhu\n",j);
return 0;
}
自己按着理解尝试修改了这个,
printf("unsigned char = %hhd\n",j);
#include <stdio.h>
int main()
{
signed char i;
unsigned char j;
i = 255;
j = 255;
printf("signed char = %hhd\n",i);
printf("unsigned char = %hhd\n",j);
return 0;
}
按我浅薄的知识,
为什么格式化参数的转化字符变为%d,以有符号十进制整数形式输出,
而且有hh长度修饰符限定,那应该只能输出一个8位的整数,而且第一位是符号位,那应该j是-1啊,那为什么运行后j仍然是255?
——————
另外,鱼老师标准答案中的%hhd,这个hh我删掉运行结果也是一样的,
在这里起啥作用呀?
你的理解非常接近,但是有一点需要注意。虽然 %d 用于有符号十进制整数输出,但是当你将一个 unsigned char 类型的变量传递给 printf 函数时,实际上是发生了隐式类型转换。在这种情况下,j 被提升为一个 int 类型的值,但它仍然保持原来的数值(255)。所以,当使用 %d 格式化参数时,j 的值仍然是 255。
关于 %hhd 和 %hd 的问题,%hhd 和 %hd 是长度修饰符,它们用于指定 printf 函数中输出整数的大小。%hhd 表示输出的整数是一个 signed char 类型的值,而 %hd 表示输出的整数是一个 short 类型的值。在这个例子中,由于 signed char 和 short 类型在传递给 printf 函数时都会被隐式转换为 int 类型,所以 %hhd 和 %hd 的输出结果是一样的。这就是为什么删除 hh 之后运行结果仍然相同的原因。在这个特定的例子中,长度修饰符对结果没有实质性影响,因为隐式类型转换已经将变量提升为了 int 类型。
|
|