Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567814
  • 博文数量: 252
  • 博客积分: 1068
  • 博客等级: 少尉
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 21:33
文章分类

全部博文(252)

文章存档

2013年(21)

2012年(231)

分类:

2012-05-05 21:35:04

原文地址:C99的变量类型 作者:yourtommy

在C89里新加了一些变量类型:
void
void*
signed char
unsigned char
unsigned short
unsigned long
long double


以及已有类型的新名称:
signed short表示short
signed int表示int
signed long表示long


C9X也加入了新的变量类型:

_Bool
long long
unsigned long long
float _Imaginary
float _Complex
double _Imaginary
double _Complex
long dobule _Imaginary
long double _Complex


C9X也允许扩展的整型类型,它们定义在里,比如int64_tuint32_t等等。还有定义在里的布尔类型bool,它作如下定义:

#define bool    _Bool
#define true    1
#define false   0

bool虽然看上去像int,但还是有稍许不同。比如:

    bool b = 0.5;
    int n = 0.5;
    printf ("b: %d, n: %d\n", b, n);

结果为b: 1, n: 0


整型与浮点型类型汇总(linux3.0.0-17-generic x86)

类型
sizeof
格式化字符串
常量举例
char
1
%hhd
123
unsigned char
1
%hhu
234U
short
2
%hd
12345
unsigned short
2
%hu
12345U
int
4
%d
1234567898
unsigned int
4
%u
1234567898U
long
4
%ld
1234567898L
unsigned long
4
%lu
1234567898UL
long long
8
%lld
12345678987654321LL
unsigned long long
8
%llu
12345678987654321ULL
float
4
%f
1234.5678F
double
8
%lf
123456789.987654
long double
12
%Lf
12345678912345.987654321L


一些浮点数的操作可能会导致非正常的值,例如:

-1的根号值为NaN。(Not a Number)

1除以0和log(0)的结果都是无穷大。

C99在里定义了fpclassify来提供对浮点数的类别判断,它是一个宏:
Macro: int fpclassify (float-type x),返回值为以下的某值:
FP_NAN:浮点数x不是一个数。
FP_INFINITE:x的值为正负无穷大。
FP_ZERO:x的值为正负0。
FP_SUBNORMAL:x的绝对值过小,以至于无法以正常的形式表示,所以用更低精度、但离0更接近的形式表示。
FP_NORMAL:x为除以上情况之外的正常的值。

除了fpclassify,还有另外几个类似的宏:

Macro: int isfinite (float-type x):等价于 (fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
Macro: int isnormal (float-type x):等价于 (fpclassify (x) == FP_NORMAL)
Macro: int isnan (float-type x):等价于 (fpclassify (x) == FP_NAN)

Ubuntu使用fpclassify时可能会出现错误:

undefined reference to `__fpclassify'

这是一个已知的bug,更新gtk-gnutella包可以解决。当然,你还要确保gcc使用了-lm选项来引入math库。


复数类型

使用里的_Complex类型,或它的别名complex可以操作复数。它的用法为:

complex c = 35 + 78i; //与35 + I*78等价
complex a = c * 2;
printf("%f+%fi", creal(c), cimag(c));
printf("%f+%fi", creal(a), cimag(a));

其中crealcimag分别得到复数的实数和虚数部分。

_Imagianry表示一个虚数,gcc没有支持这个关键字。

类型
sizeof
常量举例
float complex
8
12.3f+I*45.6f
double complex
16
1.23+4.56i
long double complex
24
1.23l+4.56l

complex等价于double complex。



阅读(693) | 评论(0) | 转发(0) |
0

上一篇:C99的结构体

下一篇:C99的restrict关键字

给主人留下些什么吧!~~