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

强制类型转换也是临时的

---恢复内容结束---

原文地址:https://www.cnblogs.com/yifan2015/p/5714749.html