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。