C语言进阶:整型数据的存储

简介: C语言进阶:整型数据的存储

一.整型数据类型介绍

short  :

unsigned short[int]

signed short[int]

int  :

unsigned int

signed int

long  :

unsigned long[int]

signed long[int]

char  :

unsigned  char

signed char

因为char 类型的数据是通过ASCII值存储的,所以也属于整型家族

下表列出了关于标准整数类型的存储大小和值范围的细节:

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):

二.整型的存储

数据在内存中以2进制的形式存储,对于整数来说:

1.整数的二进制有三种表示形式:原码,反码,补码。

2.正整数:原码,反码,补码相同;

3.负整数:原码,反码,补码需要计算;

4.计算方法:

按照数据的数值直接写出的二进制序列就是原码;

原码的符号位不变,其它位按位取反得到反码;

反码 + 1 得到补码

注意:数据都是以补码的形式存储的,计算时也是补码之间的运算,打印时按照原码打印。

三.整型提升

1.什么是整型提升:

C的整型算数运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的**字符和短整型操作数( char 属于整型家族 )**在使用之前被转换为普通整型,这种转换称为整型提升。

2.规则:

整型提升是按照变量的数据类型的二进制位符号来提升的,无符号数整型提升高位都补0,有符号数整型提升高位补符号位。

例:

四.算数转换

1.定义:

若某个操作符的各个操作数属于不同的类型,那么在运算时一个操作数的类型转换成另一个操作数的类型;

转换优先级:

long double > double > float >unsigned long int  > long  int   > unsigned int > int > char

注意:转换要合理(从下到上转换),不然会有一些潜在的问题,比如精度丢失

五.大端字节序和小端字节序

1.大端字节序:把数据的低位字节序的内容存放在高地址,高位字节序的内容存放在低地址;

2.小端字节序:把数据的低位字节序的内容存放在低地址,高位字节序的内容存放在高地址;

存放在地址中是以16进制形式存放的;

什么是低位字节序,什么是低地址呢?

如图:

可以这么理解,小端字节序是倒着存放的,大端字节序是正着存放的。

我们可以写个代码来判断当前机器是以什么字节序存储的

要想知道是大端还是小端,其实只需要判断第一个字节就行了,为了使判断过程更简单,我们可以定义  int  a=1; 原因如图:

代码实现:

1. int main()
2. {
3.  int a = 1;
4.  char* p = (char*)&a;  //强制类型转换成 char*
5.  if (*p == 1)
6.  {
7.    printf("小端\n");
8.  }
9.  else
10.     printf("大端\n");
11.   return 0;
12. }

六.char 类型的存储问题

首先 char 类型到底是 signed char 还是 unsigned char ,C语言标准并没有规定,这取决于编译器

1. 有符号型 char 的范围:-128 ~ 127

原因如图:

可以这么理解:

巧记口诀:

超出范围的数据如果是整数,则减去256;如果是负数,则加上256。

2.无符号型 char 的范围: 0 ~ 255

例1:

1. #include <stdio.h>
2. 
3. int main()
4. {
5. char a=-1;
6. signed char b=-1;
7. unsigned char c=-1;
8. printf("a=%d,b=%d,c=%d\n",a,b,c);
9. return 0;
10. }

正解:a=-1,b=-1,c=255

a 和 b 很好理解,问题就是c,我们利用上面的巧记口诀,因为 -1 是负数,-1+256=255,所以c=255;那究竟为什么是255呢?请看下图:

例2:

1. #include <stdio.h>
2. 
3. int main()
4. {
5. char a=-128;
6. printf("%u",a);
7. return 0;
8. }

正解:4294967168

解析:

     🐋😼 本篇文章到此就结束啦,如有错误或是建议,欢迎小伙伴们指出。🦖🦄

       😸😽谢谢你的阅读。😻🐼


目录
相关文章
|
23天前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
139 82
|
23天前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
24天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
26天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
26天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
27天前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
26天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
1月前
|
存储 缓存 程序员
c语言的存储类型-存储类
本文详细介绍了C语言中的存储类型及其分类,包括基本类型(如整型、浮点型)和复合类型(如数组、结构体)。重点讲解了不同存储类别(`auto`、`static`、`register`、`extern`、`typedef`、`volatile`、`const`)的特点及应用场景,并展示了C11/C99引入的新关键字(如`_Alignas`、`_Atomic`等)。通过示例代码解释了每个存储类别的具体用法,帮助读者更好地理解和运用这些概念。
|
5月前
|
存储 C语言
C语言中的数据输入输出
C语言中的数据输入输出
44 0
|
12月前
|
缓存 C语言
C语言——数据的输入输出
C语言——数据的输入输出
下一篇
无影云桌面