Skip to content

Latest commit

 

History

History
89 lines (64 loc) · 3.73 KB

data_type.md

File metadata and controls

89 lines (64 loc) · 3.73 KB

数据类型

  • float → 浮点数
  • int → 基本的整数,ISO C 规定取值范围为 -32768 ~ 32767
  • signed → 基本整数类型的变式
  • char → 字母和其他字符+较小整数,属于整数类型
  • float, double, long double → 带小数点的数
  • _Bool → 布尔值
  • _Complex → 复数
  • _Imaginary → 虚数

  • %.2f → .2 表示输出的浮点数只显示小数点后两位
  • %d → 以十进制显示数字
  • %o → 以八进制显示数字(%#o 可以显示前缀)
  • %x → 以十六进制显示数字(%#x 或 %#X 可以显示前缀)
  • %u → 显示 unsigned int 类型的值
  • %ld、%lld → 显示 long 或 long long 类型的值
  • %lo、%lx → 以八进制或十六进制显示 long 类型的值
  • %hd → 显示 short 类型的值
  • %c → 指明待打印的字符

整数

  • short int 用于较小数值可以节省空间
  • long int 占用存储空间比int多,用于数值较大
  • long long int 占用存储空间比long多,用于数值更大,至少占64位
  • unsigned int 只用于非负值场合(无符号整型),16位范围为 0~65535
  • unsigned long int(无符号整型)
  • unsigned short int(无符号整型)
  • unsigned long long int(无符号整型)
  • 在有符号类型的前面加 signed 可以强调使用有符号类型的意图

stdint.h

  • int8_t: -128 - 127
  • int16_t: -32766 - 32767
  • int32_t: -2147483646 - 2147483647
  • int64_t: -9223372036854775807 - 9223372036854775807
  • uint8_t: 0 - 128
  • uint16_t: 0 - 65535
  • uint32_t: 0 - 4294967295U
  • uint64_t: 0 - 18446744073709551615
  • 另有fast和least类型,详见文章

整数溢出:超出整数类型最大值会导致从起始点开始。

浮点数

  • 类型:float、double、long double

float

  • 必须能表示 6 位有效数字(能够表示 33.333333 的前 6 位,而不是小数点前 6 位)
  • 取值范围:10e-37 ~ 10e37
  • 通常,系统存储一个浮点数占用 32 位,8位用于表示指数的值和符号,剩下24位表示非指数部分及其符号

double

  • 最小取值范围和 float一致,但至少必须能表示 10 位 有效数字
  • 一般情况下占用 64 位,一些系统将多出的32位全部用来表示非指数部分(提高精度),有部分系统分配给指数部分以提高表示数的范围,double类型的值至少有13位有效数字

浮点型常量

  • 没有后缀的浮点型常量是double类型
  • 使用f或F后缀(9.11e9f),编译器会将浮点型常量看作float类型
  • 使用l或L后缀(9.11e9L),编译器会将浮点型常量看作long double类型

C99 新浮点型常量 —— 十六进制表示浮点型常量

十六进制数前加上0x,用p代替e,用2的幂代替10的幂(p计数法)

例如: 0xa.1fp10(十六进制a等于十进制10),.1f 是 1/16 加上 15/256(十六进制f等于十进制15),p10是$2^{10}$或1024,表示值位$(10 + \frac{1}{16} + \frac{15}{256}) * 1024$(等于十进制10364.0)

打印浮点值

  • %f → 打印十进制计数法的float和double类型

  • %e → 打印指数计数法浮点数

  • %a → 打印十六进制格式浮点数(需系统支持

  • %Lf %Le %La 表示各类long double类型

  • 尽量避免 long double 使用 double 输出,会导致降低精度

浮点数舍入错误

e.g. 一个类型为float的数(2.0e20)加上1,再减去原来的数(2.0e20),结果并不是1

原因:float类型的数字通常只能存储按指数比例缩小或放大的 6 或 7 位有效数字,若这个数为 2.0e4,计算则没有问题。