学点C语言(27):数据类型

所有基础的数据类型, 最大的也不过 10 个字节;

我们可以自定义的数据类型 -- "结构", 通过把若干类型组合在一起, 让一种类型可以大很多.

我们知道, 一个字节有八个 Bit 组成; 能否把一种类型缩小、缩小到 Bit 级?

结构中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.

下面的例子中定义的位字段, 分别有 1-4 Bit 大小; 1 Bit 的字段只能放两个数(0、1), 4 Bit 的字段也只能放下 16 个数:

1. 结构体可以包含位字段:

#include <stdio.h>

int main(void)
{
  struct Bit {
    unsigned a: 1; /* 1 Bit, 取值范围: 0 - 1 */
    unsigned b: 2; /* 2 Bit, 取值范围: 0 - 3 */
    unsigned c: 3; /* 3 Bit, 取值范围: 0 - 7 */
    unsigned d: 4; /* 4 Bit, 取值范围: 0 - 15 */
  } B;

  B.a = 1;
  B.b = 3;
  B.c = 7;
  B.d = 15;

  printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d);

  getchar();
  return 0;
}

上例中, 位域的类型被指定为是无符号的整型(unsigned int), 我试着只要是整型都可以, 但要一致.

假如我们定义 8 个字段, 每个字段都是 1 Bit, 就可以很好地明细一个字节, 譬如:

11111111B = 255;

00000001B = 1;

00001111B = 15;

01111111B = 127;

下面的例子用程序对上面的说明做了落实:

时间: 2024-10-22 10:59:40

学点C语言(27):数据类型的相关文章

学点C语言(29):数据类型

自定义的类型名一般要大写, 以提示这是自命名的类型. 1. 把 unsigned long 更名为 UINT: #include <stdio.h> int main(void) { typedef unsigned long UINT; UINT num = 1234567890; printf("%lu\n", num); getchar(); return 0; } 2. 给一个结构重命名: #include <stdio.h> int main(void

学点C语言(18):数据类型

1. printf 枚举可显示枚举的序号: #include <stdio.h> int main(void) { enum ABC{AAA,BBB,CCC}; enum ABC e1,e2,e3; e1 = AAA; e2 = BBB; e3 = CCC; printf("%d, %d, %d\n", e1, e2, e3); getchar(); return 0; } 2. 定义枚举时可同时定义变量: #include <stdio.h> int main

学点C语言(16):数据类型

曾经对float num=3.14f; 这样的赋值非常疑惑,其实现在也不明白. 既然说明了是float类型,又何必在3.14后面挂个f呢? 书上说: int num=100; 一个整数常量将默认为int类型(除非常数有后缀或超出了int的范围) double num=3.14; 一个浮点数常量将默认为double类型 并要求: long num=100L; long long num=100LL; unsigned long=100UL; unsigned long long num=100UL

学点C语言(14):数据类型

在C语言中, char类型永远都是一个字节, 双字节字符类型是wchar_t; 但它不是内置类型, 定义在 stddef.h. 给 wchar_t 类型的字符或字符数组(也就是字符串)赋值要冠以 L; 格式化输出(如 printf) wchar_t 类型的字符串, 要用 %S(而非 %s) 标识. #include <stdio.h> #include <stddef.h> int main(void) { wchar_t wc=L'A'; wchar_t ws[]=L"

学点C语言(12):数据类型

C语言数据类型: 基本类型.构造类型.指针类型.空类型. 基本类型又包括: 整型.字符.浮点(单精度.双精度).枚举. 构造类型又包括: 数组.结构体.公用体. 1. 显示整型(int)的最小.最大值: #include <stdio.h> #include <limits.h> int main(void) { int n1,n2; n1 = INT_MIN; n2 = INT_MAX; printf("%d .. %d", n1,n2); getchar()

学点C语言(28):数据类型

在结构中, 每个字段的数据类型是唯一的; 使用联合可以在一个字段中储存不同的数据类型. 不同的数据类型共享一块内存. 当然其内存大小应依着大的来. 联合中的数据, 非此即彼, 只有一个有效; 应该有说明在某个数据中此时有用的是什么类型. 除了共享内存以外, 联合与结构一样. 1. union 的大小是其中最大数据成员的大小: #include <stdio.h> int main(void) { union MyUnion { short n1; int n2; double n3; }; p

学点C语言(23):数据类型

C语言的内存分配很简单: malloc.calloc.realloc.free malloc(字节数); 返回内存段的首地址, void 的. calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空. realloc(原指针, 字节数); 重新分配由 malloc.calloc 分配的内存; 这里有太多注意事项: 1.如果缩小了, 会截掉一块, 会保留前面的内容; 2.如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化; 3.在扩大时, 有可能内存地址会变化,

学点C语言(21):数据类型

1. 获取数组的地址无须 &,因为数组名本身就是个地址 #include <stdio.h> int main(void) { char c = 'A'; char cs[] = "ABC"; printf("%c,%s\n",c,cs); /* 获取字符及字符数组的内容 */ printf("%p,%p,%p\n",&c,cs,&cs); /* 获取字符及字符数组的地址,cs与&cs没有区别*/ ge

学点C语言(26):数据类型

1. 包含数组的结构: #include <stdio.h> int main(void) { struct Rec { int x[3]; int y; } r1; r1.x[0] = 11; r1.x[1] = 22; r1.x[2] = 33; r1.y = 99; printf("%d,%d,%d,%d",r1.x[0],r1.x[1],r1.x[2],r1.y); getchar(); return 0; } 2. 结构中的结构: #include <std