一 变量、常变量、符号常量、标识符等
1变量
分配内存单元,一般情况下可以改变值,Int i;
2常变量
在变量的基础上加了一个限定,存储单元内容不允许被变化,但是仍然有存储单元
Const float PI=3.1415926;
3符号常量
是使用一个字符串代替程序中出现的标识符,编译时把所有的符号常量都替换成制定的字符串,即程序中的PI都被换成3.1415926.在内存中不存在符合常量命名的存储单元,在其作用域内其值不能改变和赋值
#define PI=3.1415926 //注意后面没有分号
优点:增加代码易读性,后续修改值一改PI 全改3.14xx
4标识符
用来对变量,符号常量名,函数,数组,类型等命名的有效字符序列同称位标识符。如变量名ch,i,符号常量名PI,函数名printf等都是标示名
二 数据类型
1.总体框图
2.表格
C数据类型 | 数据类型 | 16位机(字节) | 32位机(字节) | 可表示范围 | ||
数值类型 | 数值类型 | 整型 | short | 2 | 2 | |
int(signed int) | 2 | 4 | 对于16位:-32768-1~32768-1(2^15) 对于32位: -2^31-1~2^31 + 1 | |||
Unsigned int | 2 | 4 | ||||
long | 4 | 4 | ||||
浮点型 | float | 4 | ||||
double | 8 | |||||
字符类型 | Char | 1 | Char默认为signed char型(对于vc6.0++),不同编译系统可能不一样,使用sizeof()函数进行测试 | |||
构造类型 | 数组 | A[] | ||||
结构体 | struct | |||||
公用体 | union | 测试系统大小端(暂缺) | ||||
枚举类型 | enum | |||||
指针类型 | *p | |||||
空类型 | void |
三 不同类型的数据进行加减运算
1.Char型
(1) 数据赋值
若后面赋值是’’形式,
如char a1=’6’,则以字符型输入(‘6’对应ASICC为54);
若char a1= 6形式 ,相当于直接赋值ASCII值为006
(2) ASCII和对应字符表
几个字符:
字符’0’ -- 048
字符’A’ -- 066
字符’a’ -- 097 (‘A’+32=’a’)
2 Unsigned char 、int、unsigned int型数据相加减
代码段:
unsigned char varA = 6;
int varB = -20;
int varC = 0;
unsigned int varD = 0;
(varA+varB > 6)?puts(">6"):puts("<6"); //打印结果是______。//puts("<6")
(varB+varD > 6)?puts(">6"):puts("<6"); //‚打印结果是______。//puts(">6") ((varC = varA+varB) > 6)?puts(">6"):puts("<6"); //ƒ打印结果是______。//puts("<6")
(1).Unsigned char + int= int型(作整型提升)
(varA+varB > 6)?
-20 + 6 = -14(int)>6?假 //puts("<6")
(2).int + unsigned int = unsigned int(隐式转换)
(varB+varD > 6)?
-20 + 0 =很大的正数>6?真 //puts(">6")
(3). unsigned int = unsigned char + int varB 这里和1区别于把得到数做了类型转换成int
-20 + 6 = -14(int)
-14(int) = -14(int) >6 假 ////puts("<6")
4.相关内容扩展(摘抄部分,看关键字黑体)
(1)unsigned int 和 int 型分析
代码段
#include <stdio.h>
int main()
{
int i = -10;
unsigned int j = 3;
// unsigned char j = 3;
if((i+j) > 7) printf(">7\n");
else pritnf("<=7\n");
return 0;
}输出:>7
这里非整型提升,而是unsigned int 和int,unsigned int 和int型进行运算,int型要转为unsigned int,运算结果为unsigned int。因为unsigned int 可以表示更大的数,往更大的数转换,隐式转换。当unsigned int类型与int类型运算时,如果没有指出转换的类型,它会进行“隐式转换”转换为unsigned int类型,也可以记住,不同类型进行运算时,没指出转换的类型时,它会往容量大的那总类型转换,因为这样可以更加容易避免溢出嘛。所以最好避免对int和unsigned int的两个操作数进行比较
//由于unsigned int与int进行运算可以认为是两个补码进行运算,最终的结果若不溢出则为正确结果的补码。这样就可以分为两种情况,
//如果最终结果是正数,如果没有上溢,则为正确结果,如果是负数,因为负数的补码与不同,所以不会是正确结果。
①int类型和unsigned int类型的差别。unsigned int类型比int类型的容量大是因为,unsigned int是无符号类型的,所以最高位不表示正负,而int类型的最高位是表示正负的,1表示负数,0表示正数。
②计算机中负数的存储方式——其补码。在计算机中,负数存储的方式都是以其其补码形式储存,例如:6在计算机的存储形式是0000 0000 0000 0110(32位计算机中),而-6是1000 0000 0000 0110 (32位机下)(最高位是符号位),补码也就是1111 1111 1111 1010(32位计算机中),补码=原码取反+1。
③赋值一个负数给unsigned int类型的变量,它的意思就是将-6这个数的补码形式(1111 1111 1111 1010(32位机下))形式存到一个叫b的空间中,下次我读取这个数的时候,是使用b这个名字,按照b这个名字的类型来读取的,所以当b是unsigned int类型的时候,就不考虑最高位是符号位,则b = 1111 1111 1111 1010(32位机下)(因为是无符号),当b是int类型的时候,考虑最高位是符号位(1为负数,0为正数),当发现是1的时候也就是负数的时候,计算机会把它转换成为原码从而读出是-6。所以一个变量的类型是决定读取这个变量存储的数的方式。
④隐式转换。当unsigned int类型与int类型运算时,如果没有指出转换的类型,它会进行“隐式转换”转换为unsigned int类型,也可以记住,不同类型进行运算时,没指出转换的类型时,它会往容量大的那总类型转换,因为这样可以更加容易避免溢出嘛。
————————————————
原文链接:https://blog.csdn.net/gyyu32g/article/details/79089475
(2) int +unsigned int =unsigned int
代码段
int main()
{
int a = -6;
unsigned int b = 4;
if(a+b > 0)
printf("a+b>0\n");//这句话被打印
else
printf("a+b<0\n");
int z = a+b; //相当于进行了类型强制转换
if(z > 0)//这里是有符号数的比较
printf("z>0");
else
printf("z<0");//这句话被打印
}
下面解释一下原因:当int和unsigned in相加时,要将int转化为unsigned int,而int小于0,所以它的最高位是符号位,为1,所以转化的结果是一个很大的正数,在第一个if语句中,是两个“正数”相加,结果自然就大于0了。而在z = a+b这一句时,它把a+b的结果看做一个int类型,而a+b最高位为1,所以z是一个负数,所以打印的是第二个语句。
————————————————
原文链接:https://blog.csdn.net/thefutureisour/article/details/8147277
(3) char 和 unsigned 与int 之间
算术转换保证在执行操作前,将二元操作符的两个操作数转换为同一类型,并使表达式的值也具有相同的类型。
算术转换通常的是做整形提升(integral promotion),对于所有比int小的整形,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包含在int内,它们就会被提升为int,否则被提升为unsigned int。如果将bool值提升为int,则false转换为0,true转换为1。
包含short和int类型的表达式,short转换为int。如果int足以表示所有unsigned short类型的值,则将unsigned short转换为int,否则两个操作数均转换为unsigned int。long和unsigned int的转换也一样。只要机器上的long足够表示unsigned int类型所有的值,就将unsigned int转换为long,否则两个操作数都转换为unsigned long。在32位的机器上,long和int通常用一个字长表示,此时如果表达式包含unsigned int和long,两者都转换为unsigned long。
整数在计算机中是以二进制补码的方式表示的,以int型为例:
int有4个字节,最高位为符号位,即正数为0xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx b ,例如:
- <span style="font-size:18px;">int n = 3;</span>
在计算机里存储为0000 0000 0000 0000 0000 0000 0000 0011b;
负数为1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx b,即将该负数的绝对值按位取反,然后加1,例如:
- <span style="font-size:18px;">int n = -3;</span>
在计算机里存储为1111 1111 1111 1111 1111 1111 1111 1101b;
因为char 和unsigned char型都是一个字节,int型是四个字节的,从int 型到char 或 unsigned char型的转换都是直接将int的最低字节赋予char 或 unsigned char;例如:
- char c = 3;
- unsigned char uc= 3;
3是int型,其在计算机里的存储为 0000 0000 0000 0000 0000 0000 0000 0011b;所以 c 和 uc 在计算机里的存储都为 0000 0011b,由于是正数,故值都为3;
有例如:
- char c = -3;
- unsigned char uc= -3;
-3是int 型,其在计算机里的存储为 1111 1111 1111 1111 1111 1111 1111 1101b;所以c和uc在计算机里的存储都为1111 1101b;但由于char是有符号的,unsigned char 是无符号的;char c的最高位为符号位,符号位1表示负数,0表示正数,所以c的值为-3;而unsigned char uc是无符号的,所以值为253;
由于char或者unsigned char是一个字节的,int型是四个字节的,当char 或者 unsigned char向int 型转换的时候,高的三个字节计算机怎么处理呢?
1、因为char是有符号的,所以int 的高三个字节都是以char的最高位(符号位去填充),例如:
当c是char型,并且在计算机里存储为1111 1101b时,
- int n = c;
n在计算机里的存储为: 1111 1111 1111 1111 1111 1111 1111 1101b,又例如:
当c是char型,并且在计算机里存储为0000 0011b时,
- int n = c;
n在计算机里的存储为:0000 0000 0000 0000 0000 0000 0000 0011b;
2、因为unsigned char 是无符号的,所以int 的高三个字节都是以0填充,例如:
当uc是unsigned char型,并且在计算机里存储为1111 1101b时,
- int n = uc;
n在计算机里的存储为: 0000 0000 0000 0000 0000 0000 1111 1101b,又例如:
当uc是unsigned char型,并且在计算机里存储为0000 0011b时,
原文链接:http://blog.csdn.net/yifeiboss/article/details/52206072