C语言uint8_t / uint16_t / uint32_t /uint64_t 的简介绍

每当nesc的代码中,你见面盼多你不认得的数据类型,比如uint8_t等。咋一看,好像是单新的数据类型,不过C语言(nesc是C的壮大)里面好像没有这种数量类啊!怎么又是u又是_t的?很多人发出诸如此类的疑点。论坛及虽有人提问:以*_t结尾的花色是匪是还是long型的?在baidu上查看一下,才找到答案,这时才发现原来好对C掌握的无比少。

那么_t的意思究竟意味着什么?具体的官方答案没有找到,不过我以为有只答案于像样。它就是是一个构造的标号,可以知道啊type/typedef的缩写,表示她是透过typedef定义之,而未是另外数据类型。

uint8_t,uint16_t,uint32_t等还不是啊新的数据类型,它们只是下typedef给品种从底别名,新瓶装老酒的把戏。不过,不要小看了typedef,它于你代码的保护会来甚好之意图。比如C中从不bool,于是当一个软件中,一些程序员使用int,一些程序员使用short,会比混乱,最好就是用一个typedef来定义,如:
typedef char bool;

貌似的话,一个C的工被势必要是开有当下方面的做事,因为您晤面涉嫌到超过平台,不同的阳台会出不同之字长,所以用预编译和typedef可以被你不过管用之掩护您的代码。为了用户的有利,C99标准的C语言硬件也咱定义了这些项目,我们放心使用就可以了。

论posix标准,一般整形对应之*_t类型为: 1字节     uint8_t 2字节    
uint16_t 4字节     uint32_t 8字节     uint64_t

附:C99标准中inttypes.h的内容 00001 /* 00002    inttypes.h 00003
00004    Contributors: 00005      Createdby Marek Michalkiewicz
<marekm@linux.org.pl> 00006 00007    THISSOFTWARE IS NOT
COPYRIGHTED 00008 00009    Thissource code is offered for use in the
public domain.  You may 00010    use,modify or distribute it freely.
00011 00012    Thiscode is distributed in the hope that it will be
useful, but 00013    WITHOUTANY WARRANTY.  ALLWARRANTIES, EXPRESS OR
IMPLIED ARE HEREBY 00014    DISCLAIMED.  This includes but is not
limited towarranties of 00015    MERCHANTABILITYor FITNESS FOR A
PARTICULAR PURPOSE. 00016  */ 00017 00018 #ifndef __INTTYPES_H_
00019 #define __INTTYPES_H_ 00020 00021 /* Use [u]intN_t if you
need exactly N bits. 00022    XXX- doesn’t handle the -mint8 option. 
*/ 00023
00024
typedefsigned char int8_t;
00025
typedefunsigned char uint8_t; 00026
00027
typedefint int16_t;
00028
typedefunsigned int uint16_t; 00029
00030
typedeflong int32_t;
00031
typedefunsigned long uint32_t; 00032
00033
typedeflong long int64_t;
00034
typedefunsigned long long uint64_t; 00035
00036
typedefint16_t intptr_t;
00037
typedefuint16_t uintptr_t; 00038 00039 #endif


http://blog.sina.com.cn/s/blog_6aea878e0100tl0f.html

1>. 在描绘序时注意”无符号类型”的用, 各种类型边界值的情况.

如:
a>
当某个数不容许吧负数时我们定要考虑用以下类型:
unsigned char,
unsigned int, uint32_t, size_t, uint64_t, unsigned long
int,
b> 当有些数据而切莫了解凡是刚刚负时一定毫无因此”a>”中之类别,
不然他永远为无容许为负.

c> 数据的境界值如果多留神, 如:

uint32_t a, b, c;

uint64_t
m;

m = a * b + c;
在拖欠运算被或许出现错误,
“a*b”的花色或者超过uint32_t的顶要命价值,这时一定不要遗忘了类型转换.
m
= ((uint64_t)a) * b + c;

2>. 在适用的时节要见面自己定义数据类型.

俺们都知情linux C开发中的广泛扩展数据类型的定义有:uint8_t, uint16_t,
uint32_t, uint64_t, size_t,
ssize_t, off_t …. 他因此要和谐定义有数据类型是发道理的, 如: typdef
unsigned int uint32_t;
表示uint32_t为32号无符号类型数据, 其实size_t也是32各项无符号数据类型,
**为什么不直写”unsigned int”呢?

为了程序的而是扩展性,
假如将来我们需要的数量大小变成了64bit时常,我们就待用typedef long long
size_t就足以了,
要不然我们只是一旦修改好多丛之地方了.**
这种计划我们一致好用至祥和之开被来,当好计划一个int类型保存某种数据经常,但你又尚未把未来凡免是一旦就此long
int时你可以引用一个好定义之数据类型的啊!

stdint.h

typedef
unsigned int
uint32_t;

uint32_t.c

#include
<stdio.h>
#if 0
#include
<stdint.h> //
uint32_t
#endif

typedef
unsigned int uint32_t;
typedef
unsigned long long
uint64_t;

int
main()
{
uint32_t
a;
a =
12;
printf(“a = %x\n”,
a);
printf(“sizeof(a) = %d\n”,
sizeof(a));

uint64_t
b;
b =
12;
printf(“b = %x\n”,
b);
printf(“sizeof(b) = %d\n”,
sizeof(b));
}

a = c
sizeof(a) = 4
b =
c
sizeof(b) = 8