C语言中,对基本类型操作时数据的溢出

C语言中,对基本类型操作时数据的溢出:

以char类型为例,如下图所示:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(int argc, char *argv[])
{
	char ch = 0;
	/*此时已经超出了char类型的正数范围,进位使得得到的结果被表示为负数。
	这样的结果显然是不符合数学逻辑的。*/
	ch = 0x7f + 2;//0111 1111 + 0000 0010 = 1000 0001
	/*当使用十六进制输出时,输出结果为计算后得到的二进制原码的十六进制表示。
	只不过是采用了4字节的int类型进行输出的。*/
	printf("十六进制:%x\n", ch);
	/*当按照十进制有符号数进行输出时,计算结果则会被计算机依照原码规则,
	顺理成章的理解为负数。*/
	printf("十进制有符号:%d\n", ch);
	/*按照十进制无符号数进行输出时,要将负数时前面的一去掉,保留原来单字节时的原码
	进行十进制无符号输出。*/
	printf("十进制无符号:%u\n", ch&0x000000ff);//129
	
	system("pause");
	return 0;
}

注意1:只要知道char类型数据与出后结果的原码,就不难得到三个输出的答案。

注意2:当小类型的数据做大类型输出时,若为正数,前面不变;若为负数,前面所有位置补一。如上所示,要在int类型中得到char类型的负数原码,就要使用逻辑乘法,去掉前面的1。

猜你喜欢

转载自blog.csdn.net/Hello_MyDream/article/details/82391115