Discuss / Java / 对1取非的操作不理解

对1取非的操作不理解

Topic source

无故之秋

#1 Created at ... [Delete] [Delete and Lock User]

我实际的代码中:

int i= 1;         // i 的二进制:00000001     十进制:1     

int j = ~i;       // ~i的二进制:11111110      十进制:254

实际得到的 j 其实是 -2,这是为什么呢?

无故之秋

#2 Created at ... [Delete] [Delete and Lock User]

看了评论和搜索了相关的知识理解了。

计算机底层使用二进制形式的补码来计算和存储数据,最高位表示符号,1-负数,0-正数

原码:一个数的二进制表示

反码:正数的反码和原码相同;负数的反码为符号位不变,其余在原码基础上按位取反

补码:正数的补码和反码,补码相同;负数的反码+1

===

所以更正下:

我实际的代码中:

int i= 1;         // i 的二进制(补码):00000001     十进制:1     (省略高位的零,int类型有32bit)

int j = ~i;       // ~i的二进制(补码):11111110(原码)-> 10000001(反码)-> 10000010(补码)      十进制:-2      (省略高位的零,int类型有32bit)

实际得到的 j 为 -2。

上一节中,总结了基本数据类型的存储大小,byte 为一个字节,一个字节包含 8 bit(8位)

int 4字节,32bit(32位)

无故之秋

#3 Created at ... [Delete] [Delete and Lock User]

发现一个小手(智能助教),问问题真不错

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

Java不支持无符号整数,用rust的i8和u8测试,就是-2和254

无故之秋

#5 Created at ... [Delete] [Delete and Lock User]

好的,初学编程,自身先积累编程经验多一点再去学习Rust。

无故之秋

#6 Created at ... [Delete] [Delete and Lock User]

个人觉得如果评论可以插入图片的话,会比较能直观地反映出读者正在遇到的编程困难。

🌙

#7 Created at ... [Delete] [Delete and Lock User]

计算用补码,显示用源码


  • 1

Reply