avatar

zian

A text-focused Halo theme

  • Java
  • 面试
  • 首页
  • C语音
  • liunx
  • 数据结构与算法
  • 控制台
Home C语言基础数据类型
文章

C语言基础数据类型

Posted 2024-12-21 Updated 2024-12- 21
By Administrator
19~25 min read

char 数据类型

C语言中使用关键字 char 来表示字符,char是英文单词character的缩写,中文翻译为字符,一般用来存储ASCII码中的字符.

ASCII码有两种:标准ASCII(128个字符)+ 拓展ASCII(256个字符),只需要使用 8bit (8位二进制数据)可以表示任意一种,意味着只需要1个存储单元(1字节)。

char 数据类型实际上存放的是一个小于等于255编号的(无符号整数)用来表示字符,这个无符号证书编码被称为ASCII码

如何查看ascii码 1. 百度 2. 使用 man 函数在 Linux系统下输入 man ascii,按 q退出

'A' --> 65
'a' --> 97
'0' --> 48

char b = 'c' // 99

char c = b + 7; // 99 + 7  0110 0011 + 0000 0111   106 -> "j"

printf("c = %c", b) ; // j

注意:如果使用 sizeof('j')计算指定字符的内存大小返回值为 4,sizeof运算符计算给定类型或表达式内存所占字节时,
字符 'j' 他是一个常量,在C语言中就是一个ascii数字 106, 'j'就被提升成了 int类型从而返回的是int类型的大小而不是字符的大小。
所以不要使用这种方式计算字符的大小

    printf("c 字节 %d \n",sizeof(c)); // 1

    printf(" 字节 %d \n",sizeof(char)); // 1

    printf("'j' 字节 %d \n",sizeof('j')); // 4

转义字符

概念:
所有的ASCII码都 可以用 \ 加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 \ 来表示常见的那些不能显示的ASCII字符,如 \0,\t,\n等,\被称为转义字符,因为后面的字符,都不是它本来的ASCII字符的意思了。它告诉编译器需要用特殊的方式进行处理。

格式一:'\ddd' :ddd代表 1到3位八进制数

printf("%c\n", '\102');    //输出B,因为大写字母B的在ASCII码表中的八进制为 0102

格式二:'\xdd' :dd表示1到2位十六进制数

printf("%c\n", '\x42');    //输出B,因为大写字母B的在ASCII码表中的十六进制为 0x42

以下是一些常见的转义字符

转义字符 值
'\n' 换行
'\t' 横向跳格(相当于是Tab)
'\r' 回车,返回行首
'\' 反斜杠
'%%' %

练习1: 以下哪些不是字符

"a"  'a'  '\t'   '\n'   '\033'  '\0x10'

练习2:

'\41' 转换之后的字符是什么  //!

浮点型

概念:用来表达实数(小数)的数据类型
分类:

  • 单精度浮点型(float),在64位系统中典型尺寸是4字节,精确到小数点后6位
  • 双精度浮点型(double),在64位系统中典型尺寸是8字节,精确到小数点后15~16位
  • 长双精度浮点型(long double),典型尺寸是16字节

浮点型的书写方式

  • 十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 ......符合规则
  • 指数形式:一般数学上对于小数可以以10为底进行表示 比如 3.14 * 10²,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言规定以字母 e或者 E来表示指数,并且要求字母 e或者 E的前面必须有数字,字母e或者E的后面必须为整数。
#include <stdio.h>

int main(int argc, const char* argv[]) {
  // float 占用 4 个字节
  float a = 1.2;
  printf("%f \n", a);

  // double 占用  8 个字节
  double b = 1.2;
  printf("%lf \n", b);

  // long double 占用 16 字节
  long double c = 1.2;
  printf("%Lf \n", c);

  return 0;
}

浮点型底层存储的原理
https://www.hello-algo.com/chapter_data_structure/number_encoding/
特点:提供 浮点型的范围但是牺牲了精度。

0.1 + 0.2 != 0.3 的问题


int main(int argc, const char* argv[]) {
  double a = .1;
  double b = .2;
  double c = a + b;
  double d = .3;

  printf("%.17f \n ", c);   // 0.30000000000000004
  printf("%.17f \n ", d);  // 0.29999999999999999
  printf("%d \n", c == d);   // 1 
  
  return 0;
}

上面例子中 0.2 + 0.1 != 0.3 就是因为浮点型在底层存储的方式导致的。

整型

表达整数的数据类型
语法:

int number = 15; // 定义一个专门存放整数的数据类型

需要注意的地方:

  • int 的本意是 integer,即整数的意思
  • int number 代表在内存中开辟一块小区域,称为 number,用来存放整数,number 一般被称为变量。
  • 变量 number 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节(描述4*8=32位二进制)。
数据类型 字节数 格式符 数据范围 最小值宏 最大值宏
short(短整型) 2 %hd -2^15^~ 2^15^-1 (-32768 ~ 32767) SHRT_MIN SHRT_MAX
int(整型) 4 %d -2**^31^ ~ 2^31^-1 (-2147483648 ~ 2147483647)** INT_MIN INT_MAX
long(长整型) 4 %ld -2^31^~ 2^31^-1 (-2147483648 ~ 2147483647) LONG_MIN LONG_MAX
long long(长长整型) 8 %lld -2^63^~ 2^63^-1 LLONG_MIN LLONG_MAX
unsigned short(无符号 短整型) 同 short %hu 0~ 2^16^-1 (0 ~ 65535) 0 USHRT_MAX
unsigned int(无符号 整型) 同 int %u 0~ 2^32^-1 (0 ~ 4294967295) 0 UINT_MAX
unsigned long(无符号 长整型) 同 long %lu 0~ 2^32^-1 (0 ~ 4294967295) 0 ULONG_MAX
unsigned long long(无符号 长长整型) 同 long long %llu 0~ 2^64^-1 0 ULLONG_MAX

由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。

比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。

再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。

可以使用 sizeof 查看 数据类型 占用内存的大小。

可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。

#include <stdio.h>
#include <limits.h>
​
int main(void)
{
    printf("short 大小 = %llu\n", sizeof(short));
    printf("short 最小值 = %hd, 最大值 = %hd\n", SHRT_MIN, SHRT_MAX);
    printf("unsigned short 最小值 = 0 最大值 = %hu\n", USHRT_MAX);
    printf("\n");
    
    printf("int 大小 = %llu\n", sizeof(int));
    printf("int 最小值 = %d,最大值 = %d\n", INT_MIN, INT_MAX);
    printf("unsigned int 最小值 = 0, 最大值 = %u\n", UINT_MAX);
    printf("\n");
​
    printf("long 大小 = %llu\n", sizeof(long));
    printf("long 最小值 = %ld, 最大值 = %ld\n", LONG_MIN, LONG_MAX);
    printf("unsigned long 最小值 = 0 最大值 = %lu\n", ULONG_MAX);
    printf("\n");
​
    printf("long long 大小 = %llu\n", sizeof(long long));
    printf("long long 最小值 = %lld, 最大值 = %lld\n", LLONG_MIN, LLONG_MAX);
    printf("unsigned long long 最小值 = 0, 最大值 = %llu\n", ULLONG_MAX);
    printf("\n");
​
    return 0;
}

整形应该包括:byte 数据类型的,但是 c 语言没有,如果需要使用两中方式

  1. 使用 char 类型来代替,应为都是一节字节
  2. 使用 stdint.h 中的 uint_8 来代替 , (底层也是char)
#include <stdio.h>
#include <stdint.h>

int main(){
  // byte 一个字节的 ,
  // 在 c 语言中默认是没有 byte 数据类型的,一般都是用 
  unsigned char a = 12;
  printf("byte %u \n", sizeof(unsigned char));
  printf("bype %u \n", sizeof(a));

  // 另一种方式 导入 <stdint.h> 使用该头文件中提供的, uint_t 8 数据类型  , 底层也是用 unsigned char  的 
  uint8_t b = 12;
  printf("bype %u \n", sizeof(b));
  // 拓展:stdint.h 中定义堆的数据类型, 
  // 比如 uint8_t  代表 无符号的byte | uint16_t 代表无符号的:short | uint32_t 代表无符号的 int | uint64_t 代表无符号的 long
  // stdint 中定义这些数据,是为了在不同平台下数据占用的字节数是一样的,(适配不同平台)
  return 0; 
}

bool型

目标:知道 bool 类型两种取值

C语言在设计之初是没有布尔类型的,使用 1 和 0,对应表示真、假。

但,其他编程语言像 C++、java 都设计有布尔数类型。 C语言在1999 年推出的新标准(C99)中,也加入了 布尔类型。**用 true 来代表 1,为真;用 false 来代表 0,为假。**使用时,需要引入头文件 #include <stdbool.h>

#include <stdbool.h>
​
int main(void)
{
    printf("%d, %d\n", true, false); // 1, 0
    return 0;
}

虽然语法上与其他语言一致,但 C 语言每次在使用时需先引入头文件,较为麻烦。 因此,一些老 C 工程师还是喜欢直接在程序中用 1 和 0 来表示 真和假。

注意:

  1. 0 就是 false , 所有非零的数都是 true
  2. 在 bool 头文件,定义了 true 的值为1 , false 的值为 0
C语音
License:  CC BY 4.0
Share

Further Reading

Jan 7, 2025

C语言 其他

作用域 关键字 register 在C语言中,register 关键字是一种存储类说明符,用于建议编译器将变量存储在CPU寄存器中,而不是内存中。这样做可以提高访问变量的速度,因为寄存器的访问速度通常比内存快得多。然而,这个关键字只是一个提示,编译器可以选择忽略它。 使用register关键字的变量

Jan 6, 2025

C语言 结构体

结构体 问题的引入 多个相同数据类型的数据可以用数组表示,那么,如果多个不同数据类型的数据如何用一个集合表示呢?? 前面我们所介绍的普通数据类型实际上远远未能满足我们对实际应用中的要求,比如说一个学生,可能包含的属性有年龄、姓名、分数等等,不可能用一个基本数据类型(int 、float 、char)

Dec 28, 2024

C语言 内存

内存 什么是内存 软件在运行是,临时用来存储数据的 操作系统会将内存按照字节划分为 N 多个小格子 什么是内存地址 其实就是格子的编号 32 位操作系统:以 32 位的二进制表示 64 位操作系统:以 64 位的二进制表示 内存地址的作用 快速操作内存中存储的数据 C 语言中如何获取内存地址 &变量

OLDER

main 函数

NEWER

原码、反码和补码以及溢出

Recently Updated

  • 其他
  • Elasticsearch 面试
  • Spring 面试
  • RabbitMQ 面试
  • Redis 面试

Trending Tags

ruoyi docker java

Contents

©2025 zian. Some rights reserved.

Using the Halo theme Chirpy