整形包括字符、短整形、整形、长整形,整形的存储方式都是一样的,整形在存储时都是以补码进行存储的。
下面用char来解释:
signed char -128 到127
unsigned char 0 到 255
short int -32768 到32797
unsigned short int 0 到65535
Char
Char类型其实也是一种整形,因为char的每个字符都是由0到255的整形数字来表示的;
ANSI C提供了char、signed char和unsigned char三种字符类型;
它们都是按照一个字节存储的,可以保存256个不同的值;
unsigned char无符号的整形存储简单,因为正整数的原反补码相等,范围是0到255,直接存入相应的二进制。
signed char 的取值范围在-128到+127,为什么在这个范围呢?
计算机在存储数据都是以数据的补码来进行存储,有符号类型存储是,最高被当做符号位,0正1负,所以signed char取值范围在
-(2^7)-1到+(2^7)-1,但是发现这个值是-127到+127,这是因为+0和-0被计算了两次,但实际情况0只有一个,计算机一般把+0当做零,把-0当做-128,所以signed char 的取值范围是-128到+127;
这里计算机是怎样把-0识别为-128?
因为系统识别到最高位是1后面全0的情况,系统会在最高位自动添加一个符号位,所以-128具有9个bit位
-128在存入内存的时,因为char只有8个bit位,所以读取低8位,结果是1000 0000;
与-0的二进制序列一样,所以就用-128表示-0;系统识别1000 0000 时就会自动添加一个符号位,就是-128了。(在这里计算时符号位参与运算)
原码 1 1000 0000
反码 1 0111 1111
补码 1 1000 0000
下面看几个有关理解整形存储的代码:
#include<stdio.h>#include<windows.h>int main(){ unsigned char a = -1; signed char b= -1; char c = -1; PRintf("a=%d b=%d c=%d/n", a, b,c); system("pause"); return 0;}signed char型提升为int型打印时,char补码的符号位前面要全补成和char相同的符号位,然后在把最高位当做符号位,求原码。
#include<stdio.h>#include<windows.h>int main(){ char a = 128; char b = -128; printf("a = %u/nb = %u/n", a,b); system("pause"); return 0;}不论是128 还是-128保存到cahr a里面都是读取补码的低8位即1000 0000;
在a解释用于打印的时候会把最高位(第八位)作为符号位即1,所以char 提升为unsigned int类型,char的符号位前面的根据char类型全补成1。 然后以无符号整形输出。
新闻热点
疑难解答