杂记3(指各种知识)

简介: 杂记3(指各种知识)

char的取值范围

char分为signed char 和 unsigned char 两种类型

先说signed char(即char)的取值范围,什么是signed char呢?即有符号的char

我们知道一个char在内存中占据一个字节,即八个比特位。用二进制表示char的取值范围就是00000000--11111111。那么你是否认为signed char的类型就是0--255呢?

如果你这样认为那么你就错辣!实际上,signed char的取值范围是-128--127。

为什么会这样呢?

所谓有符合数,就是指他的码的最低位(最左侧位)会被当作符号位,不进行计算。

举个例子,像是10000010,因为它是有符号数,最左侧的1会被当作符号位,表示负且不计算值的大小(如果是0则表示正),

因此10000010表示-2而不是130。最低位是否被当作符号位,这就是有符号数和无符号数之间的显著差别。

signed char 00000000至01111111表示0--127

10000000至11111111表示-127-0

等等,这样的话signed char的范围不就是-127--127了吗?!

笔者查了查资料,解释如下:

在signed char中,0有两种表示方式即00000000和10000000(这样的话只能表示-127--127这255个数字)。而signed char有8个比特位,可以表示256个数字,因此C语音规定(乌龟的屁股!)10000000表示-128。

signed char的取值范围分析完毕,而后再说unsigned char即无符号字符

前面已经提到,有符合型和无符号型间的显著区别就是最低位(最左侧位)是否被当作符号位。

unsigned char的取值范围同样也是00000000--11111111。这次就可以肆无忌惮地计算了,它的每一位都要参与计算,无需关心符号位的问题了。因此unsigned char的取值范围是0--255.

关于二维数组

有监控窗口可知,

arr[0]代表了第一行的所有元素,是int[4]类型(但它又是首元素地址)

arr[0]代表了第二行的所有元素,是int[4]类型

arr[0]代表了第三行的所有元素,是int[4]类型

arr+0代表了第一行首元素地址,是int[4]*

arr+1代表了第二行首元素地址,是int[4]*

arr+2代表了第三行首元素地址,是int[4]*

arr[0]+1 这个1,加的是int 类型大小

关于联合体

用Union判断机器的大小端

 
union s
{
    char a;
    int b;
};
int main()
{
    union s s1;
    s1.b = 1;
    if (s1.a == 1)
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

1的十六进制序列

高位-->低位

0x 00 00 00 01

1在内存种的存储

地址:低地址-->高地址

小端 01 00 00 00

大端 00 00 00 01

Union的大小计算

 
union s
{
    char a[9];
    int b;
}s1;
int main()
{
    printf("%d", sizeof(s1));
}

输出的结果是:12

如何计算的?

  1. union的大小不小于成员大小的最大值
  2. union的大小必须是最大对齐数的整数倍

以上题为例,成员最大大小是9个字节,最大对齐数是4.因此union的大小是12.

union嵌套union的大小

 
union k
{
    char a[17];//17 1/8
    double b;//8 8/8 
};
union s
{
    char a[9];//9 1/8
    union k s2;//24 8/8
    int b;///4 4/8
}s1;
int main()
{
    printf("%d", sizeof(s1));
}

输出结果是: 24

由于共用体所有成员是共用一块空间的,因此计算共用体的大小只用找到最大成员的大小,并确保它是最大对齐数(包括嵌套联合体成员的对齐数)的整数倍就可以了。

相关文章
|
5月前
|
Java
揭秘Java文件操作背后的惊天秘密:读写、复制、删除一网打尽!
【6月更文挑战第27天】Java文件操作涵盖读、写、复制和删除。例如,读文件使用`BufferedReader`和`FileReader`;写文件利用`BufferedWriter`和`FileWriter`;复制文件通过读写流实现;删除文件则依赖`Files.delete()`。以上代码示例展示了具体实现。
36 5
|
6月前
|
Java 开发者 UED
掌握Java多线程编程:从基础到高级
【5月更文挑战第31天】本文深入探讨了Java多线程编程的核心概念,包括线程的创建、生命周期、同步机制以及高级并发工具。通过实际示例和代码片段,读者将学会如何有效地管理和协调线程,以编写高效且稳定的并发应用程序。
|
5月前
|
算法 Linux 调度
技术好文共享:详解操作系统中断
技术好文共享:详解操作系统中断
|
6月前
|
存储 缓存 算法
|
6月前
|
存储 编译器 程序员
|
6月前
|
C语言
(保姆级)函数基本内容
(保姆级)函数基本内容
52 5
|
Java 程序员 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十八)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十八)
49 1
|
Java 程序员 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)
73 0
|
Java 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十七)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十七)
58 0
|
存储 缓存 Java
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)(2)
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)
313 0
java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)(2)