有符号数下的负数

以短整型为例,其他的有符号和无符号类型都类似:

short int为有符号短整型,范围在:-32768 - 32767

unsigned short int 为无符号短整型,范围在:0 - 65536

 

a: short int类型下的变量variableA 为 32767,则打印出来的值就是32767;

b: short int类型下的变量variableB为 32768,则打印出来的值是 -32768;

c: short int类型下的变量variableC为 32769,则打印出来的值是 -32767;

 

理解:

a: 范围内,无需解释;

b: 32768变量的二进制存储为:1000 0000 0000 0000,计算机认为是有符号的,最高位为1,则为负数,按照负数规则:源码取反 + 1 => 取反为 0111 1111 1111 1111 并加1,还是为1000 0000 0000 0000,为32768,加上负号,即-32768;

c:同b过程,为-32767;

 

记忆:

变量为有符号数时,数值超过了该类型正数范围,则该数为负数,且根据负数的绝对值加上该数值等于该类型的取值范围区间的跨度个数可以得到该负数;

帮助记忆:

有符号数 32768,超过了最大正数范围 32767,该数为负数,该类型的取值范围区间的跨度个数为65536(65535+1),负数的绝对值为65535-32768=32768,加上负号,为-32768.

 

补充扩展: 

问题1:当变量的值为无符号短整型数,取的值超过了正数取值范围,怎么判断结果?

如:unsigned short int的范围为 0 - 65535,

变量variableD为无符号短整型,值为65536;

变量variableE为无符号短整型,值为65537;

分析:

65536的存储为:1 0000 0000 0000 0000,计算机认为你是无符号短整型,会自动截取了低16位(由右往左),即为0;

65536的存储为:1 0000 0000 0000 0001,计算机认为你是无符号短整型,会自动截取了低16位(由右往左),即为1;

 

问题2:当变量的值为有符号短整型数,取的值超过了负数取值范围,怎么判断结果?

如:signed short int的范围为 -32768 ~ 32767,

变量variableF为有符号短整型,值为65536;

变量variableG为有符号短整型,值为65537;

分析:

65536的存储为:1 0000 0000 0000 0000,计算机认为你是有符号短整型,会自动截取低16位(由右往左),即为0;

65537的存储为:1 0000 0000 0000 0001,计算机认为你是有符号短整型,会自动截取低16位(由右往左),即为1;

你可能感兴趣的:(C++使用积累,C语言使用积累)