段落1. 百度百科char
char用于C或C++中定义字符型变量,只占一个字节,取值范围为 -128 ~ +127(-2^7~2^7-1)
知识点:负数在计算机中以补码存储,而正数以原码存储。
为什么负数在计算机中以补码存储呢?
因为所以科学道理,可以看这篇知乎文章:https://www.zhihu.com/question/335614901/answer/755608419
不看也可以,只要知道负数在计算机中有用补码来存储的必要性就行了,而且这个必要性是有科学道理的。
段落2. 求正数在计算机中存储的二进制值
请问 char j = 5 这句代码中, j 在计算机中存的二进制值是多少?
正数以原码存储,5的原码是0b0000 0101. 所以 j 在计算机中存的二进制值是 0b0000 0101 。
段落3. 求负数在计算机中存储的二进制值
请问 char j = -12这句代码中, j 在计算机中存的二进制值是多少?
负数以补码存储
先找对该负数对应的正数,即12。 12 的原码是 0b0000 1100 .
我们将上述原码的最高位置为1, 得到0b1000 1100.
然后再求补码:
0b1000 1100 , 符号位不变,其余各位取反 =》0b11110011 再加1 =》得到0b11110100 。
我们最终得到的0b11110100 等价于0xF4。
我们来写代码验证一下,思路是使用%x来打印出其十六进制的内存值。不过%x会打印出4字节,我们只需关注最低一个字节就行了。
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #include <unistd.h> int main(){ char j = -12; printf("%x \n", j); return 0; }
root@lmw-virtual-machine:/home/lmw/桌面/C_Text# ./ab fffffff4 root@lmw-virtual-machine:/home/lmw/桌面/C_Text#
上面提到可以先找到该负数对应的正数12, 那么12的原码可不仅仅是0b0000 1100 , 还可以是0b 0000 0000 0000 0000 0000 0000 0000 1100 (32位, 合计4字节),
相同的操作手法我们再来一遍,
我们将上述原码的最高位置为1, 得到0b1000 0000 0000 0000 0000 0000 0000 1100 .
然后再求补码:
符号位不变,其余各位取反 =》0b1111 1111 1111 1111 1111 1111 1111 0011, 再加1 =》得到 1111 1111 1111 1111 1111 1111 1111 0100 。
我们最终得到的0b1111 1111 1111 1111 1111 1111 1111 0100 则等价于 0xFFFFFFF4。
补充段落:
如果赋值的数是超过char类型的上限值的,那么先减去256的倍数, 再根据上面方法计算其在计算机中存储的二进制值。
.