C 理解符号扩展

C 理解符号扩展,c,C,给出-1-1。为什么不出现符号扩展,以及它何时出现?因为printf查看的是原始内存,而不是类型。使用%u将值打印为无符号 看 确实发生了符号扩展,但您打印的结果不正确。在打印中,如果您为b指定了%d,但b未签名,则应使用%u打印b printf不知道其参数的类型,并使用指定的格式来解释它们 int main() { unsigned int b; signed int a; char z=-1; b=z; a=z; printf("%d %d",a,b); } “什么

给出-1-1。为什么不出现符号扩展,以及它何时出现?

因为
printf
查看的是原始内存,而不是类型。使用
%u
将值打印为无符号


确实发生了符号扩展,但您打印的结果不正确。在打印中,如果您为
b
指定了
%d
,但
b
未签名,则应使用
%u
打印
b

printf不知道其参数的类型,并使用指定的格式来解释它们

int main()
{
  unsigned int b;
  signed int a;
  char z=-1;
  b=z;
  a=z;
  printf("%d %d",a,b);
}

“什么是未签名的?”:显然是一个拼写错误,因为已修复。人类通常表现出更好的认知能力,这确实发生了。如果没有,你会看到255,255。@Hans:任何255都存在的想法令人困惑,因为它假设了一个与C相反的值模型……澄清一下:在C中,不能检查变量的类型(这就是为什么我们对
printf
有不同的格式说明符)。可以找到一个很好的格式说明符列表。
printf
不“查看原始内存”。如果您传递了错误的参数类型,它只会有UB。例如,在x86_64上,参数将不在内存中,如果您传递的浮点类型预期为整数,
printf
将不会检查浮点值表示的位并将其作为整数打印;它根本看不到它们。那你怎么解释;无符号字符z=-1;printf(“%u%d”,z,z);给出相同的输出?未定义的行为就是未定义的行为。如果你看不出这是如何回答你的问题的,请在字典中查找“未定义”和“行为”这两个词,并冥想直到它变得清晰。
printf("%d %u",a,b);