就以char为例,char可以是unsigned和singed类型。
如果是unsigned类型,取值范围是:00000000 —— 11111111 ,即 0——255,一共256个数,这个很好理解。
如果是singed类型,第一位是符号位,0表示正数,1表示负数,那么正数范围是:00000000 ——01111111 ,即0——127,而负数在内存中可存储的范围是:10000000——11111111,即-128—— -1,因为负数在内存中以补码形式存储,除去符号位 000 0000——111 1111正好有128个数字,所以负数取值范围是-1——-128,-1的补码是1111 1111,-128的补码是 1000 0000。
如果对一个变量赋的值超出该类型能容纳的取值范围,编译器会怎么处理呢?
以char为例:
unsigned char c = -1;
unsigned char取值范围是0——255,unsigned char的大小是256,c中实际存储的值是255,即-1%256。
signed char d = 300;
signed char 取值范围是 -128 ——127,signed char 的大小是256,d中实际存储的值是44,即 300%256,许多的编译器都会这样处理,像处理unsigned类型一样,但是我们并不能保证每个编译器都会这么做。