WHCSRL 技术网

[c语言基础]--几个小常识搜索记录

一 变量、常变量、符号常量、标识符等

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型数据相加减

代码段:

  1. unsigned char varA = 6;
  2. int varB = -20;
  3. int varC = 0;
  4. unsigned int varD = 0;
  5. (varA+varB > 6)?puts(">6"):puts("<6"); //打印结果是______。//puts("<6")
  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 型分析

代码段

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = -10;
  5. unsigned int j = 3;
  6. // unsigned char j = 3;
  7. if((i+j) > 7) printf(">7 ");
  8. else pritnf("<=7 ");
  9. return 0;
  10. }输出:>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

代码段

  1. int main()
  2. {
  3. int a = -6;
  4. unsigned int b = 4;
  5. if(a+b > 0)
  6. printf("a+b>0 ");//这句话被打印
  7. else
  8. printf("a+b<0 ");
  9. int z = a+b; //相当于进行了类型强制转换
  10. if(z > 0)//这里是有符号数的比较
  11. printf("z>0");
  12. else
  13. printf("z<0");//这句话被打印
  14. }

下面解释一下原因:当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 ,例如:

  1. <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,例如:

  1. <span style="font-size:18px;">int n = -3;</span>  

在计算机里存储为1111 1111  1111 1111  1111 1111 1111 1101b; 

  1. int型转换为char和unsigned char

因为char 和unsigned char型都是一个字节,int型是四个字节的,从int 型到char 或 unsigned char型的转换都是直接将int的最低字节赋予char 或 unsigned char;例如:

  1. char c = 3;  
  2. unsigned char uc= 3;  

3是int型,其在计算机里的存储为 0000 0000  0000 0000  0000 0000  0000 0011b;所以 c 和 uc 在计算机里的存储都为 0000 0011b,由于是正数,故值都为3; 

有例如:

  1. char c = -3;  
  2. 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; 

  1. char和unsigned char 转换为int 型

由于char或者unsigned char是一个字节的,int型是四个字节的,当char 或者 unsigned char向int 型转换的时候,高的三个字节计算机怎么处理呢? 

1、因为char是有符号的,所以int 的高三个字节都是以char的最高位(符号位去填充),例如: 

当c是char型,并且在计算机里存储为1111 1101b时,

  1. int n = c;  

n在计算机里的存储为: 1111 1111  1111 1111  1111 1111 1111 1101b,又例如: 

当c是char型,并且在计算机里存储为0000 0011b时,

  1. int n = c;  

n在计算机里的存储为:0000 0000  0000 0000  0000 0000  0000 0011b; 

2、因为unsigned char 是无符号的,所以int 的高三个字节都是以0填充,例如: 

当uc是unsigned char型,并且在计算机里存储为1111 1101b时,

  1. 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

推荐阅读