关键字符的十进制表示法 我不熟悉C++,所以当我在浏览CRACKE的来源时,我觉得有点困惑,好像是223或

关键字符的十进制表示法 我不熟悉C++,所以当我在浏览CRACKE的来源时,我觉得有点困惑,好像是223或,c++,C++,foo=0xde;//222 unarfoo=~(foo);//-223 当我运行这行代码时,正在被翻译成字符“!” cout0xde=11011110b,~(0xde)=00100001b=0x21十六进制,在ASCII表格中代表 < C++中的SO运算符是位否定的< /P> < P> java,它使用Unicode(64位值)来处理字符,所以当你尝试一个-233时,它会在Unicode表的顶部附近出现,而且很可能不能在你的系统上表示。 您在C中看到的程序使用的是8位宽的char数据类型。所以

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

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

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

< C++中的SO运算符是位否定的< /P> < P> java,它使用Unicode(64位值)来处理字符,所以当你尝试一个-233时,它会在Unicode表的顶部附近出现,而且很可能不能在你的系统上表示。
您在C中看到的程序使用的是8位宽的
char
数据类型。所以a~(-233)与33(或
字符)几乎相同(按位计算)

foo
是0xde或0x000000de

~foo
是0xffffff21


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

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

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


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

忘记了它的正确名称;现在修好了,不是用html吗?我认为0x33等于dec 51或char 3,你是指33十进制,或0x21十六进制。实际上,java字符类型是2字节长,java使用UTF-16。它不使用64位字符。因此,如上所述,~foo是0xFFFF21;(char)~foo是0x21(感叹号),所以按位。。。如果我理解正确的话。。。正在截断前6个F六角体。。。或者忽略只留下0x21,即33或!马克?好吧,我假设这是对的,尽管我不能在C编译器atm上自己测试它。我想,当我在java中尝试它时,我得到了这些让我感兴趣的结果<代码>系统输出打印项次(结果-0)//65313 System.out.println(Integer.toHexString(result))//ff21
似乎只有前4个F十六进制被截断,这可以解释为什么我没有得到0x21,忘记了上下文o的这段代码。o
char result=(char)(~(foo))foo=0xde