C语言数值表示和计算
---恢复内容开始---
一、数据类型
在我的Windows上查看<limit.h>可以看到对数据类型长度的定义
#define SHRT_MIN (-32768) // minimum (signed) short value
#define SHRT_MAX 32767 // maximum (signed) short value
#define USHRT_MAX 0xffff // maximum unsigned short value
#define INT_MIN (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX 2147483647 // maximum (signed) int value
#define UINT_MAX 0xffffffff // maximum unsigned int value
#define LONG_MIN (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX 2147483647L // maximum (signed) long value
此外推荐<stdint.h>根据比特位数选择数据类型如uint16_t,无符号16位整数
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
大尾端:高字节放在存储地址低位(地址0最低),低字节放高端(不同尾端,每个字节内部顺序都是一样,不同字节在内存、磁盘中排列顺序不同)
网络字节序转本机字节序:ntohl,ntohs
本机字节序转网络字节序:htonl,htons
浮点数都有符号位,float整体精确表示位数有限,23位尾数表示7位十进制数字,使用更精确的中间值如long double,最后存入double(精确16位),使用浮点数关注末尾误差的累积。
二、数据类型隐式转换规则
隐式转换是在赋值右边计算过程临时改变对其二进制码解释规则,不改变二进制码也不会根本性改变解释规则,C语言缺省规则为数值表示范围小的数据转换为大的。最后赋值结果数据长度和解释方式决定于=左边数据类型。
1、有符号数无符号数同时出现在一个表达式,无符号转换为有符号,即把负数的补码解释为无符号数,往往是很大的正数,这在逻辑表达式以及减法运算中易错误,除非与数值计算无关的,其他少用无符号数
2、都是有符号数直接扩,无符号同理
整形数的截断与扩展
1、赋值时左小于右的数据长度,左边只能截取右边的低位,解释方式不变,故负数可能变成正数
2、正数相乘相加后溢出截断保留低位,长度为左边类型的
2、扩展后数值不变
三、类型转换
基本转换:char,short运算前被转换int,float变double,做完基本转换若运算符两端数据类型仍不一致,编译器做自动类型转换
C语言没有规定char一定是有符号的,故使用时一定写名signed或unsigned,ASCII字符最高位0
自动类型转换:窄变宽(同类无符号变有符号);浮点数间大转小丢失小数;浮点转整数具体分析,反之ok
强制类型转换也是临时的
---恢复内容结束---