Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210350
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 798
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-14 14:54
文章分类

全部博文(87)

文章存档

2015年(87)

我的朋友

分类: C/C++

2015-05-23 10:04:22

1、C和C++语言中基本的数据类型有:字符型(char),整形(short, int, long), 浮点型(float, double) 
 

类型

字节数

类型

字节数

char

1

short

2

int

根据系统而定,可能是24

long

4

float

4

double

8

同时字符型和整形还可以继续分为带符号的和不带符号的,默认情况下都是带符号的,如果想使用不带符号的,则使用时带上 unsigned说明即可,如果是带符号的,那么最高位将表示符号位,最高位为0表示为正数,最高位为1表示为负数,因此根据这个可以得到不同类型在分别带符号和不带符号的情况下表示的数据范围:

类型

范围

类型

范围

signedchar

-128——127

unsigned char

0——255

(signed) short

-32768——32767

unsigned short

0——65535

(signed ) int

-32768——32767

unsigned 
int

0——65535

(signed) long

-2147483648——2147483647

unsigend
long

0——4294967295

float

-3.4*10-38——3.4*1038

double

-1.7*10-308——1.7*10308

 
2、对于字符型和整形特别需要注意其表示的范围,如果运算导致超出其范围的处理,如以下的代码:
  1. int main() 
  2. { 
  3.     signed char ch = 127;
  4.     ch += 1;
  5.     printf("%d\n", ch);

  6.     return 0; 
  7. }
输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表示的最大数,其最终结果-128的来历是这样的:
第一步:首先127在计算机中用二进制表示为:01111111;
第二步:01111111 + 00000001 = 10000000;
第三步:由于ch是带符号的,当最高位为1时,表示是负数,而负数的计算机中是利用补码来存储的,回忆计算负数补码的方法(首先取负数的绝对值,然后求二进制,对二进制取反,在对取反后的值加1,即为负数的补码);
第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,首先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本身是负数,即ch为-128.
 
再看以下一段代码:
  1. int main() 
  2. { 
  3.     unsigned char ch = 255;
  4.     ch += 1;
  5.     printf("%d\n", ch);

  6.     return 0; 
  7. }
输出结果为:0;
其分析为:首先ch = 255提升为整形,在计算机的存储为:(000....)11111111,然后(000....)11111111+1 = (000...)0001 00000000;然后再将最后的八位二进制截取给ch,由于最后八位全是0,因此ch = 0了。
同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果。

3.float和double的范围和有效数字
首先说一下: 范围是3.4E-38 ——3.4E+38,可提供7位有效数字。 
上述这两个量都是近似值,各个编译器不太一样的。 
下面我就将标准值是怎么定义的说一下: 
这个比较复杂,建议找一下IEEE754标准看一下。  
在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位、指数位和尾数位。 
这些位的构成如下: 
种类-------符号位-------------指数位----------------尾数位---- 
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit) 
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit) 
取值范围主要看指数部分: 
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。 
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。 
由于float的指数部分对应的指数范围为-128~128,所以取值范围为: -2^128到2^128,约等于-3.4E38 — +3.4E38 
精度(有效数字)主要看尾数位: 
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位
阅读(826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~