Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1800306
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-04-24 23:53:49

在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。



阅读(2244) | 评论(2) | 转发(2) |
0

上一篇:C99的restrict关键字

下一篇:C99的结构体

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

yourtommy2012-04-25 17:21:11

147189385: C99标准下,变量在使用之前其定义位置是否可以任意?.....
你是指变量原型的声明吗?变量不需要在作用域的开头声明,只要在使用前声明就可以。
比如:
int a = 5;
a += 3;
int b; // on the fly
b = a + 4;

甚至于:
for (int i = 0; i < 100; i++)
....

1471893852012-04-25 16:18:24

C99标准下,变量在使用之前其定义位置是否可以任意?