C笔记02-C数据类型与数据类型转换


注: 所学视频及PPT截图来源: 爱课程资源共享课

C语言的数据类型

1.内存的编址(16进制无符号整数)

2.原因

3.分类

总结:
四大类: 基本,构造,指针,空
两主类: 基本,构造
基本类: 有符号,无符号(unsigned)

  • 整型int:长的(long int)短的(short int)一般的(int)
  • 实型:单的(float)双的(double)和长的(long double)
  • 字符型char
  • 枚举型enum

构造类: 数组array,结构struct和共用union


数据类型转换(笔者渣翻)

(C11标准草案N1570,笔者的渣翻,原文请参见:WG14 N1570)

6.3 数值类型转换
1.一些操作符会自动将操作数从一种类型转换为另一种类型.无论是隐式转换还是显示转换,本小节将会详细说明这些转换的结果情况.章节6.3.1.8中的列表总结了大多数普通操作符的转换情况;同时会在章节6.5中针对每个操作符进行讨论和补充.
2.将操作数的值转换为兼容的数据类型不会造成值的变化或表现形式的变化.

6.3.1算数操作数
6.3.1.1布尔值,字符型和整型

1.每一个整数类型都有如下的整型转换顺序排名:

  • 即使两种带符号整数类型有相同的表示形式, 它们不会拥有相同的转换排名
  • 对于带符号整数类型,精度越高,排名越靠后
  • 排名: long long int > long int > int > short int > signed char
  • 任何无符号整数类型的排名应该同其对应的带符号整数类型(如果存在的话)相同
  • 任何标准的整数类型应该比任何相同width的扩展整数类型靠后
  • 排名: char = signed char = unsign char
  • _Bool类型的排名应该比所有其他标准整数类型靠前
  • 枚举类型的排名应该和与其兼容的整数类型相同(见6.7.2.2)
  • 两种扩展的带符号整数类型的相对排名由实际的实现环境决定(由平台决定),但依然服从整数转换排名的其他规则
  • 排名的传递性:对于所有整数类型T1,T2和T3,如果排名T1 > T2,T2 > T3,那么排名T1 > T3.

2.当一个表达式中用到int类型或unsigned int 类型时,可能会执行下面的规则:

  • 情况1:当一个对象或语句是整数类型(int 或unsigned int除外)且其转换排名低于或等同于int 和unsigned int时
  • 情况2:当语句中含有_Bool,int,signed int 或unsigned int 的一个位域时

如果用int类型可以表示以上所有情况的原始类型并不会造成数据丢失时,该语句中的以上类型值被自动转换为int,否则转换为unsigned int类型.这种转换称之为整型提升.除以上类型之外的其他类型,不会受到整型提升的影响

3.整型提升不仅保护值,也保护符号.但正如先前讨论过的,一个普通的char类型是否会被当做带符号的数进行处理取决于实现环境.

6.3.1.2 布尔类型
当一个标量值被转换为_Bool类型时,如果标量值为0,结果为0;否则,结果为1.

6.3.1.3 带符号与无符号整数

  • 当一个整数类型值被转换为除_Bool外的另一种整数类型时,如果其值能被新类型表示,保持不变.
  • 否则, 如果新类型是无符号的,其值会被反复加上或减去一个比新类型所能表示的最大值还大1的数,直至所得到的值在新类型的标识范围之内.
  • 另外一种情况是新类型是带符号的且原值不能被新类型所表示;此时,要么其结果是由实现环境决定的值,要么会发出一个需要环境实现的通知.

6.3.1.4 实型浮点数和整数

1.当一个有穷的实型浮点类型值被转换为非_Bool的整数类型时,小数部分被丢弃.如果整数部分不能被该整数类型所表示,则其行为未定义的.
2.当一个整数类型的值被转换为实型浮点类型时:

  • 如果其值在该浮点类型中能被准确表示,保持不变.
  • 如果其值在浮点类型的表数范围内,但又不能被完全精确地表示时(浮点数作为数的近似表示所特有的情况),其值为最接近的可精确表示值(是舍入还是舍出,取决于实现环境).
  • 如果被转换的数值在浮点型的表数范围之外,此行为是未定义的.
  • 一些隐式转换的结果的表示可能比新类型的范围更广,精度更高

6.3.1.5 实型浮点类型

当一个实型浮点数转换为另一种实型浮点类型时:

  • 如果旧值可以被新类型精确表示,保持不变.
  • 如果旧值在新类型的表数范围内但由不能被精确表示时,结果为最接近的可精确表示值(是舍入还是舍出,取决于实现环境).
  • 如果旧值在新类型的表数范围之外,此行为时未定义的.
  • 一些隐式转换的结果的表示可能比其新类型所要求的范围更广,精度更高

6.3.1.6 复数类型

当一个复数类型的值转换为另一种复数类型时,实部与虚部都需要遵守相应实型的转换规则.

6.3.1.7 实型和复数类型

当一个实型值转换为一个复数类型时,复数类型的实部遵守相应实型的转换规则,而虚部的结果值为正零或无符号零.

6.3.1.8 常规算数转换规则

许多期望操作数为算数类型的运算符用一种相似的方法进行转换和生成结果类型.其目的是为操作数和结果确定一个通用的实数类型.对于具体的操作数,每个操作数都被转换(不改变类型域)为一个新类型,该新类型的对应实类型即为通用实类型.除非有其他说明,否则该通用实类型也是计算结果对应的实类型,结果的类型域与操作数的类型域相同(如果两者一样的话).这种模式称为常规算数转换.

  • 首先,如果任何一个操作数对应的实类型是long double,另一个操作数被转换(不改变类型域)为一个对应实类型也为long double的新类型.

  • 无long double操作数时,如果任何一个操作数对应的实类型是double,另一个操作数被转换(不改变类型域)为一个对应实类型也为double的新类型.

  • 无long double 和double操作数时,如果任何一个操作数对应的实类型是float,另一个操作数被转换(不改变类型域)为一个对应实类型也为float的新类型.

  • 如果float,double,long double均无,则两操作数同时进行整数提升.然后,如下的规则被应用到已进行整型提升的整型数之上:

    • 若两操作数类型相同,不再进行转换.
    • 若类型不同:
      • 若两操作数都是带符号整型或无符号整型,排名靠前的向排名排名靠后的转换(指的是char,short,int三者)
      • 若两操作数之一是无符号整型,且顺序排名不高于另一个操作数,另一个操作数向它作转换.
      • 若操作数之一为带符号整型,且其表数范围涵盖了另一个无符号整型的所有值,那么无符号整型向带符号整型作转换.
      • 其余情况下,两操作数都向带符号整型操作数所对应的无符号整型作转换.
  • float类型操作数和float类型表达式的结果值的表示可能会比该类型所要求的范围和精度更大一些;但是其类型不会因此而改变.


4.常量与变量

常量constant(字面量):程序中不能改变其值
常量多是基本类型的字面量形式出现(也可以用const关键字定义)

整型常量:(默认为int,十进制)
默认:123
长整型:123L
无符号:123u
八进制:(前导-数字0)0123
十六进制:(前导-数字0字母x)0x12B

实型(默认为double,十进制)
默认:0.123
单精度:0.123f/0.123F
科学计数法:1.23e-1
长双精度:0.123L

字符型(单引号括起来,双引号不是字符常量)
‘z’,‘0’

枚举类型:略

变量: 变量必须先定义后使用.

变量定义: 类型 变量名;

变量赋值(assignment):
1.初始化(initialize)
2.未被初始化的变量的值:随机数(乱码)
3.赋值语句:多重赋值,从右往左

变量属性: 变量类型,变量名,变量值,变量地址(存储空间起始字节的地址作为变量的地址)

5.数据类型的含义

内存空间不同

整型: 长整4,短整2,int系统相关
实型: 单精4,双精8,长双系统相关
字符型:1个字节

注:因为 int 和 长双精度 字节数不确定,我们使用时必须多加小心.
1.尽量避免使用 int 和 long double,而使用确定的其他基本类型
2.必须使用 int 或 long double时,不能对数据所占字节数想当然,必须使用运算符sizeof对可能的多种情况作兼容处理.

存储形式不同:

  • 整型高低分两部,浮点阶码和尾数

  • 字符就是ASCII码,不够还有扩展法

  • 文字多来码不够,字符终归unicode

可进行的运算不同:
%: C语言中,只有整型类才能进行%运算,浮点数不能进行%运算.

浮点数具体的存储实现

(ANSI C并未规定浮点的存储方式,想要简单了解一下其原理,参考js浮点数 )

原文地址:https://www.cnblogs.com/peterzhangsnail/p/12521654.html