C语言由位数截取的原因所引发的错误-创新互联

在聊二进制的位数截取之前呢我们需要先了解两个知识点,一是数字类型的不同所占的存储空间是不同的,进而导致每个数据类型所能存储的数据范围不同。二是编译过程中计算机原码,反码,补码的转换。

创新互联服务项目包括宁夏网站建设、宁夏网站制作、宁夏网页制作以及宁夏网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,宁夏网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到宁夏省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!一、常见数据类型的存储空间 1.整数类型

1.1char:占用的内存空间:1字节 8bit;

能存储的数据范围:无符号:[0, 2^8-1],有符号:[-2^7, 2^7-1]

1.2short:占用的内存空间:2字节 16bit;

能存储的数据范围:无符号:[0, 2^16-1],有符号:[-2^15, 2^15-1]

1.3.int:占用的内存空间:4字节 32bit

能存储的数据范围:无符号:[0, 2^32-1],有符号:[-2^31, 2^31-1]

1.4.long:占用的内存空间:8字节 64bit

能存储的数据范围:无符号:[0, 2^64-1],有符号:[-2^63, 2^63-1]

2.浮点类型

浮点型存储涉及到小数的二进制,取得大部分都是近似值,本次不讨论。

3.空类型

void 叫做空类型,不占用内存空间,一般搭配指针使用,后续再说指针。

二、原码、反码、补码转换的问题。 1.转化的规则

无符号数:原码、反码、补码 都是一样的

有符号的正数:原码、反码、补码 都是一样的

有符号的负数:反码==原码中符号位不变,其他位按位取反 0变成1 1变成0

2.存储时的不同

存储时看数据(正负),取出时看类型(有无符号)

三、实例演示

了解完这些问题,咱们通过一些例子去验证一下。

1.正常情况
int main(int argc, const char *argv[])
{
	unsigned char a = 10;
	//存储时
	//原码: 0000 1010
	//反码: 0000 1010
	//补码: 0000 1010
	//取出时
	//补码: 0000 1010
	//反码: 0000 1010
	//原码: 0000 1010 -->10
	printf("a = %d\n", a);//10

	signed char b = -10;
	//存储时
	//原码: 1000 1010
	//反码: 1111 0101
	//补码: 1111 0110
	//取出时
	//补码: 1111 0110
	//反码: 1111 0101
	//原码: 1000 1010 -->-10
	printf("b = %d\n", b);//-10
2.错误情况
signed char c = 129;
	//存储时
	//原码: 1000 0001
	//反码: 1000 0001
	//补码: 1000 0001
	//取出时
	//补码: 1000 0001
	//反码: 1000 0000
	//原码: 1111 1111 -->-127
	printf("c = %d\n", c);// -127

	unsigned char d = -1;
	//存储时
	//原码: 1000 0001
	//反码: 1111 1110
	//补码: 1111 1111
	//取出时
	//补码: 1111 1111
	//反码: 1111 1111
	//原码: 1111 1111 -->255
	printf("d = %d\n", d);//255

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:C语言由位数截取的原因所引发的错误-创新互联
标题来源:http://scjbc.cn/article/dcgdgo.html

其他资讯