在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