关键字符的十进制表示

decimal representation of key chracters

本文关键字:十进制 表示 字符      更新时间:2023-10-16

我对C++不太熟悉,所以当我在寻找破解的来源时,我有点困惑,因为它看起来像是短的-223或

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

当我运行这行代码时,正在被翻译成字符"!"。。。

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

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

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

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

所以c++中的~算子是一个逐位否定

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

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

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

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

所以本质上,这只是一个将字符解释为有符号或无符号的问题。

foo为0xde或0x000000de;

CCD_ 6为0xffffff21;

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