C语言记录汇总

时间:2022-05-17 14:02:45
uint32_t    
转载自:http://blog.sina.com.cn/s/blog_6aea878e0100tl0f.html
体会
1>. 在写程序时注意"无符号类型"的使用, 各种类型边界值的情况.
    如:
   a> 当某个数据不可能为负数时我们一定要考虑用以下类型:
      unsigned char, unsigned int, uint32_t, size_t, uint64_t, unsignedlong 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>. 在适当的时候要会自我定义数据类型.
    我们都知道linuxC开发中的常见扩展数据类型的定义有:uint8_t, uint16_t, uint32_t, uint64_t, size_t,ssize_t, off_t .... 他之所以要自己定义出数据类型是有道理的, 如: typdef unsigned intuint32_t; 表示uint32_t为32位无符号类型数据, 其实size_t也是32位无符号数据类型,为什么不直接写"unsigned int"呢?
    为了程序的可扩展性, 假如将来我们需要的数据大小变成了64bit时,我们只需要将typedef long longsize_t就可以了, 不然我们可要修改好多好多的地方了.
这种设计我们同样可以应用到自己的开发中来,当自己设计一个int类型保存某种数据时,但你又没把握将来是不是要用longint时你可以引用一个自己定义的数据类型的啊!

stdint.h
-----------------------------
typedef unsigned int           uint32_t;

uint32_t.c
-----------------------------

  1. #include <stdio.h>
  2. #if 0
  3. #include<stdint.h>   // uint32_t
  4. #endif
  5. typedef unsigned int      uint32_t;
  6. typedef unsigned long long uint64_t;
  7. int main()
  8. {
  9. uint32_t a;
  10. a = 12;
  11. printf("a = %x\n", a);
  12. printf("sizeof(a) = %d\n", sizeof(a));
  13. uint64_t b;
  14. b = 12;
  15. printf("b = %x\n", b);
  16. printf("sizeof(b) = %d\n", sizeof(b));
  17. }
  18. a = c
  19. sizeof(a) = 4
  20. b = c
  21. sizeof(b) = 8
  1. int main()
  2. {
  3. unsigned __int64 a ;
  4. printf("请输入a:");
  5. scanf("%I64u",&a);
  6. printf("a = %I64u\n",a);
  7. a = (unsigned __int64)1 << 60;
  8. printf("a = %I64u\n",a);
  9. a = 1 << 60;//由于没有转换类型,1移位造成越界变成了0
  10. printf("a = %I64u\n",a);
  11. return 0;
  12. }

C语言记录汇总


  1. #include<stdio.h>
  2. int main()
  3. {
  4. unsigned long long a = (unsigned long long)1 << 63;
  5. printf("%llu\n",a);
  6. return 0;
  7. }

树的双亲表示法

由于树中的每个结点都有唯一的一个双亲结点,所以可用一组连续的存储空间(一维数组)存储树中的各个结点,数组中的一个元素表示树中的一个结点,每个结点含两个域,数据域存放结点本身信息,双亲域指示本结点的双亲结点在数组中位置。

C语言记录汇总

C语言代码实现:

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20
typedef char ElemType;
typedef struct Snode //结点结构
{
ElemType data;
int parent;
}PNode; typedef struct //树结构
{
PNode tnode[MAX_SIZE];
int n; //结点个数
}Ptree; void InitPNode(Ptree &tree)
{
int i,j;
char ch;
printf("请输入结点个数:\n");
scanf("%d",&(tree.n)); printf("请输入结点的序及值其双亲序号:\n");
for(i=0; i<tree.n; i++)
{
fflush(stdin);
scanf("%c,%d",&ch,&j);
tree.tnode[i].data = ch;
tree.tnode[i].parent = j;
}
tree.tnode[0].parent = -1;
} void FindParent(Ptree &tree)
{
int i;
printf("请输入要查询的结点的序号\n");
scanf("%d",&i);
printf(" %c 的父亲结点序号为 %d\n",tree.tnode[i].data,tree.tnode[i].parent);
} int main()
{
Ptree tree;
InitPNode(tree);
while(1) //测试
FindParent(tree);
return 0;
}

测试结果:

C语言记录汇总