1.数据类型
在这之前我们就都知道在定义一个变量的时候都需要声明该变量的数据类型,同时在内存中是以二进制的形式进行储存。大小为4 个字节的int类型,就等于32 个比特位,即我们有32位数来存储信息。
255在空间之中就是这样存储的
而第一位则为我们的符号位;该位为 0 则为负数为 1 则为正数。而这就是-255。这时候就有人要问了:“难道255跟-255的区别不是只是一个符号位而已吗?”
原码反码补码
一个整形存储在内存之中的是他的补码,而我们的十进制数字转换成的二进制数字则是这个数的原码。对于正数来说该数的原反补码都相等,而负数的反码为原码除符号位外按位取反,同时补码是反码的基础上加一。转成补码后我们发现补码与正255的差别就只有符号位不同而已。
unsigned的加入
在数据类型前加上unsigned说明该数据为无符号整型,即没有正负号没有符号位来参加运算。
2.储存方式
当我们打开VS中的内存窗口可以看到的是
我们可以看到在a的地址之中存放的是ff000000的数值。而255转化成十六进制则是 ff 这又有什么联系呢?
大端or小端储存模式
每个编译器的模式不一样 存储的方式取决与编译器,而不是电脑或个人设置。
说人话就是:我们把 255 看成 000000ff 将其低位保存的也就是ff放在低地址位。从上图我们可以看出内存的显示是由小到大的。即 a 所申请的四个字节的低地址位就是它的第一个字节(即低地址),所以我们将 ff 放在第一个字节如此往上递推。
同样123456的存储方式也是如此。这样的存储方式变成作小端存储模式
相反则为大端。
细心的同学这时候又会看到,为什么 4 0 不交换 e 2 不交换?
这是由于地址是以字节为单位的,每个地址单元都对应着一个字节只考虑字节之间的存储而没有进行字节内部的交换。
3.基本换算与应用
现在我们来看看这道题目。
定义变量的数据类型与最终打印所打印的数据类型是解决问题的关键。我们可以看到 a 变量是char的数据类型而char的大小只有 1 个字节而打印则需要打印一个整形,这时候就涉及到了整形提升。而整形提升的规律如下
而singned 跟普通的char并无区别所以结果一样
而unsigned char 的-1经过整形提升后变成
如此转换成十进制则是 255 同时原反补相同则输出255。