首页 > 学院 > 开发设计 > 正文

C语言中整形在计算机中的存储

2019-11-11 06:47:01
字体:
来源:转载
供稿:网友

整形包括字符、短整形、整形、长整形,整形的存储方式都是一样的,整形在存储时都是以补码进行存储的。

下面用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。 然后以无符号整形输出。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表