当前位置:网站首页>c语言-数据存储部分

c语言-数据存储部分

2022-08-11 05:30:00 CHAKMING1

目录

一、数据类型介绍

二、不同进制的表示方法以及相互之间的转换

1.二进制、十进制、十六进制之间的转换

2. 二进制与八进制之间的转换

三、整型在内存中的存储:原码、反码、补码

四、大小端字节序介绍及判断


一、数据类型介绍

c语言中提供了许多常见的数据类型,每种数据类型所占字节大小是有规定的,大小决定了他们的适用范围,而且在不同的环境底下,所占的字节大小有些许差异。

char c;          // 字符类型
short i;         // 短整型
int i;           // 整型
long i;          // 长整型
long long i;     // 更长的整型
float f;         // 单精度浮点型
double f;        // 双精度浮点型
char *pc;        // 指针类型
struct stu {};   // 结构体类型
enum Week{sun};  // 枚举类型
union Data {};   // 共用体类型
C声明字节数
有符号无符号32位64位
charunsigned char11
shortunsigned short22
intunsigned int44
longunsigned long48
int32_tint32_t44
int64_tint64_t88
float44
double88

二、不同进制的表示方法以及相互之间的转换

在计算机程序设计里面,我们会经常见到几种进制,最为熟悉,也是最适合我们人类的进制就是十进制,除此之外,还有二进制、八进制以及十六进制。

1.二进制、十进制、十六进制之间的转换

在C语言中,以0x或者0X开头的数字常量被认为是十六进制的值。十六进制也就是值不能超过十六的进制,10-15的数字就用字符'A'到'F'来表示。字符可以是大写也可以是小写,也可以是大小写混合。参考一下表格:

十六进制数字01234567
十进制值01234567
二进制值00000001001000110100010101100111
十六进制数字89ABCDEF
十进制值88101112131415
二进制值10001001101010111100110111101111

比如:假设给你一个数字0x123AC4 。可以通过展开每个十六进制数字,将它转为二进制格式:如下所示:

十六进制123AC4
二进制000100100011101011000100

这样就得到二进制0001 0010 0011 1010 1100 0100

同理,反过来,也可以给定一个二进制数字1111001010110110110011,首先是分成4个为一组来转为十六进制。不过要注意位数总数不是4的倍数时,最左边的用0补上。如图所示:

二进制001111001010110110110011
十六进制3CADB3

那么,十进制和十六进制表示之间的转换需要使用乘法或者除法来进行处理。将一个十进制33转为十六进制,转换方法如下:

33 / 16 == 2 ...... 1

2  /  16 == 0 ...... 2 

 那么这时候余数自底向上看,得到的结果就为21,那么33的十六进制就是21。

同理,相反来看,一个十六进制A3转为十进制,就需要用乘法实现:

A * 16^1 = 160

3 * 16^0 = 3

160 + 3 = 163

 从低位开始乘d(d表示几进制)的i次方(起始是0,每增加一位,增加1),最后将结果相加,就得到十六进制A3的十进制为163。

2. 二进制与八进制之间的转换

在C语言里面,以0开头的数字常量被认为是八进制的值。八进制也就是值不能超过8的进制。

八进制数字01234567
十进制值01234567
二进制值000001010011100101110111

 假设给你一个035的八进制数,和十六进制的展开方法一样,结果为011101

 假设给你一个100110的二进制,转为八进制,结果为045

三、整型在内存中的存储:原码、反码、补码

计算机的整数有三种表示方法:原码、反码和补码。

三种方法表示均有符号位数值位两部分,符号位用0表示“正”,符号位用1表示“负”,只有在有符号类型的数据里面才是用这种表示方法。。

首先,正数的原码、反码、补码都是相同的,就是一个正数的二进制表示形式。

其次,负数的三种表示方法各有不同。

  • 原码:正数的二进制表示,最高位为1。
  • 反码:原码的符号位不变,其他位取反
  • 补码:反码+1得到补码

那么,对于整形来说,数据存放在内存中的都是补码。

有符号数转为补码其他表示方法:

我们用二进制1101转为十进制的补码形式,可以将最高位的1当成-1.

1101 --> -2^3 + 2^2 + 2^0 = -3 --> 1011

而1011就是二进制1101的补码。

四、大小端字节序介绍及判断

对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。那么就有两种表示字节排列顺序的规则:大端存储和小端存储。

那么,假设变量x的类型为int,占用4个字节,位于地址0x100处,存储了一个十六进制为0x01232134.

大端法:

地址0x1000x1010x1020x103...
01232134...

小端法:

地址0x1000x1010x1020x103...
34212301...

总结:

  • 大端(存储)模式:是指数据的地位保存在内存的高地址中,而数据的高位,保存在低地址中。
  • 小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

那么,我们如何测试自己当前机器是否用哪种存储模式呢? 代码如下:

#include <stdio.h>

int check_sys()
{
    int i = 1;
    // 1 的二进制为 0000 0000 0000 0000 0000 0000 0000 0001
    return (*(char *)&i);
}

int main()
{
    int ret = check_sys();
    if(ret == 1)
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

原网站

版权声明
本文为[CHAKMING1]所创,转载请带上原文链接,感谢
https://blog.csdn.net/CHAKMING1/article/details/123536710