printf 中的否定
Negation inside printf
我有下面的代码,但我不确定为什么 printf 内部的否定与外部的否定不同?
char d=0x04;
printf("Value of d= %X\n",~d);
d=~d;
printf("Value of d= %X\n",d);
打印出来的结果是FFFFFFFB和FB。
这意味着我可以说,在 printf 内部,表达式被转换为整数类型(默认提升),因此出现了 4 个字节!
在执行~
运算符的操作之前,它提升为int
的操作数的类型。这意味着结果: ~0x04
在您的情况下将是 0xFFFFFFFB
,因为类型 int
的宽度似乎是 32 位。
如果值 0xFFFFFFFB
被传递给 printf,它不会被提升为 int
,因为它已经是那个类型,并且它被打印出来。
如果将 0xFFFFFFFB
分配回 d
,则以实现定义的方式完成从 int
到 char
的转换。在您的情况下,结果值为:0xFB
。当 d
传递给 printf 时,它被提升为 int
,提升为 int
时 0xFB
的值保持不变,并被打印出来。
我有下面的代码,但我不确定为什么 printf 内部的否定与外部的否定不同?
char d=0x04;
printf("Value of d= %X\n",~d);
d=~d;
printf("Value of d= %X\n",d);
打印出来的结果是FFFFFFFB和FB。 这意味着我可以说,在 printf 内部,表达式被转换为整数类型(默认提升),因此出现了 4 个字节!
在执行~
运算符的操作之前,它提升为int
的操作数的类型。这意味着结果: ~0x04
在您的情况下将是 0xFFFFFFFB
,因为类型 int
的宽度似乎是 32 位。
如果值 0xFFFFFFFB
被传递给 printf,它不会被提升为 int
,因为它已经是那个类型,并且它被打印出来。
如果将 0xFFFFFFFB
分配回 d
,则以实现定义的方式完成从 int
到 char
的转换。在您的情况下,结果值为:0xFB
。当 d
传递给 printf 时,它被提升为 int
,提升为 int
时 0xFB
的值保持不变,并被打印出来。