0

我对 C++ 不熟悉,所以当我在寻找破解的源代码时,当它看起来像是简短的 -223 或

foo = 0xde;// 222 unarfoo = ~(foo);// -223

被翻译成字符“!” 当我运行这行代码时......

cout << (char)(~(foo));// outputs "!"

这显然不是 ascii 翻译,因为 ascii 不对字符使用负数,所以我猜这是 C 编译独有的东西,因为当我尝试将任何负 short/int 翻译成 java 上的字符时,我得到的是一个“?”。

谁能详细说明到底发生了什么以及为什么?非常感激!

4

4 回答 4

1

0xde = 11011110b, ~(0xde) = 00100001b = 0x21 十六进制,在 ASCII 表中代表!

所以 C++ 中的 ~ 运算符是按位否定

于 2012-07-15T21:16:23.193 回答
0

正在发生的是处理器如何处理二进制补码运算和负数。情况是它们是相同的:因为字符几乎每次都是 8 字节,所以你得到的是:

富 = 222; unarfoo = ~foo = -(255 - foo) = - (255 - 222) = -233

所以本质上它只是将 char 解释为有符号或无符号的问题。

于 2012-07-15T21:19:55.037 回答
0

Java 对字符使用 UNICODE(64 位值),因此当您尝试使用 -233 时,它最终会出现在 UNICODE 表顶部附近的某个位置,并且很可能无法在您的系统上表示。

您在 C 中看到的程序使用的char是 8 位宽的数据类型。所以 ~(-233) 与 33 (或!字符)几乎相同(按位)

于 2012-07-15T21:19:02.850 回答
0

foo是 0xde 或 0x000000de;

~foo是 0xffffff21;

(char)~foo是 0x21(感叹号)

于 2012-07-15T21:19:07.497 回答