使用變數型別的良好習慣
最近在把老人寫的code 在x86_64 上做測試
才深刻體會原來寫一個好程式 要注意 data type 的使用
在32bit 機器上
#include <stdio.h>
int main()
{
int i = 10;
int *p = &i;
int pp = (int)p;
return 0;
}
但這太麻煩了, stdint.h 內定義了 intptr_t 這個type
當你需要把pointer 轉型成 integer 的時候 你不確定是32 or 64bit
就可以使用intptr_t
#include <stdio.h>
#include <stdint.h>
int main()
{
int i = 10;
int *p = &i;
intptr_t pp = (intptr_t)p;
return 0;
}
所以 下面這三個打印數值是相同的
#include <stdio.h>
#include <stdint.h>
int main()
{
int i = 10;
int *p = &i;
intptr_t pp = (intptr_t)p;
printf("%p\n", p);
printf("%lx\n", pp);
printf("%p\n", &i);
return 0;
}
否則就是 int ( 64位元的 int 是32bit, 32位元的int 也是32bit)
================================
同樣的, 關於portability 還有幾點需要介紹
那就是primitive data type
32 64
char 1 1
short 2 2
int 4 4
long 4 8
long long 8 8
pointer 4 8
可以注意到 long, and pointer type 是有差異的
所以long 必不portable
所以stdint.h 內也定義了
35 #ifndef __int8_t_defined
36 # define __int8_t_defined
37 typedef signed char int8_t;
38 typedef short int int16_t;
39 typedef int int32_t;
40 # if __WORDSIZE == 64
41 typedef long int int64_t;
42 # else
43 __extension__
44 typedef long long int int64_t;
45 # endif
46 #endif
47
如果你明確要使用64位元的整數 請使用int64_t
可以看到int64_t 在64bit machine 是long int
而32bit machine 要用long long int
================= size_t =================
看看下面這個小程式
1 #include <stdio.h>
2 #include <string.h>
3
4 void main()
5 {
6 int i = -1;
7 if (i > strlen ("hello"))
8 printf("hello\n");
9 }
==================ptrdiff_t ================
同樣的 用來表示pointer 之間的difference
但是是signed integer
64bit machine => long
32bit machine => int
原文
http://nickhung0807.blogspot.tw/2014/05/blog-post.html
留言列表