计算机内部存储有这样几个概念:
原码,补码,反码。
存储的变量在计算机中最大能显示的数字与其存储所占位数相关。
举例:
一个整型变量有4个字节,一个字节占了8bit,因而一个整型变量在计算机中最大可由32位二进制表示。
同时注意,存储时的第一位(从左到右的第一位,即最高位),为符号位,用于表示数字的正负。0为正,1为负。
原码:
原码为整数的二进制表示。如5的二进制表示为101。但是结合符号位与存储位数,实际上5在计算机中由0000000000000000100表示(类型为整型时总长度为32)。
反码:
反码为原数的二进制全部取反,但是仅限于负整数。正整数的原反补码全部相同,而负整数则需遵循规定,反码全部取反。
补码:
补码为反码+1,如-5,反码表示为01111111111010那么-5的补码即为反码+1,即01111111111011。实际上,在计算机中存储的是补码。正整数原反补码相同,负整数则要经过变换。负整数通过补码得到原码的过程与通过原码得到补码的过程相同,均为取反+1。
操作符:
注:操作符操作的必须为整数
左操作符与右操作符:
左操作符为:"<<",右操作符为:">>",在键盘上分别为左右两边。
左右操作符相当于运算操作符。例如b=(a<<1),a本身的值不变,而b则被赋予了a经过运算后的值。
左右操作符的概念:
左右操作符为对被操作数的补码进行左右移动,且本身只是运算操作符不会对数本身进行改变只能用于赋值。
左操作符:
如上面的"a<<1"为左操作符,意为a的补码左移1位后的值。操作的情况为左边的数丢掉,右边空出来的位置用0补上。
右操作符:
右移操作符有两种移动,一种为逻辑右移:左边用0填充,右边丢弃。另一种为算数右移:左边用原该值的符号位填充,右边丢弃。右移操作符具体为哪种取决于编译器,一般为算数右移。
位操作符(二进制位,运算时含符号位):
&为按位与
|为按位或
^为按位异或
~为按位取反
无符号数:
无符号数是在使用的角度来看,例如一个数使用的是补码,原本一个数补码的第一位为符号位,使用unsigned,则第一位符号位也变成了数的一部分。例如-1的补码为1111111111111111.....,第一位本来为符号位1表示负数,但是使用unsigned,第一位则不是符号位,-1代表的是111111111111...这个二进制所代表的数。用法为a=(unsigned 类型) 变量。
整型提升:
c语言整型算数运算,表达式中的字符与短整型操作数需要经过整型提升补完整变成普通整形才能运算。
在变量内部存储时看变量类型能存储几位,那么就将末几位存储在变量内部。
有符号操作数将第一位当作符号位补完整,多出来的都用符号位表示。
无符号操作数则默认用0表示。
常见的编译器上,char为有符号char,即signed char。