东湖之滨 发表于 4 小时前

【C语言】巨细端字节序和字节序判定

前言:

在上章先容了整形在内存的储存,相识了原码,反码,补码,知道了整数在内存的储存一样平常是补码,办理了负数相加的题目。
那么在本章为各人解说一下巨细端字节序。
一·那字节序是什么呢?

字节序(Endianness)决定了多字节数据在内存中的存放次序。比方,一个32位整数 0x12345678 占4个字节,其存储方式因字节序而异:
在盘算机体系中,多字节数据(如整数、浮点数)的存储方式有两种大相径庭的计谋:大端字节序(Big-Endian)和小端字节序(Little-Endian)。
二·巨细端字节序又是什么?


[*]        高位字节是,低位字节可以,类比123(一百二十三),1就是高位字节,3就是低位字节
[*]        大端模式:高位字节在前(低所在),低位字节在后。

[*]                内存布局:12 34 56 78(所在由低到高)
[*]                类比:誊写数字时从左到右(如“1234”直接存储为12 34)。
       
[*]        小端模式:低位字节在前(低所在),高位字节在后。

[*]                内存布局:78 56 34 12(所在由低到高)
[*]                类比:倒序誊写数字(如“1234”存储为34 12)。
       
https://i-blog.csdnimg.cn/direct/80d02281632e4a4f830d5f7086cea5c2.png
训练

1.

欧克,根本相识了巨细端字节序,那么我们怎样知道他是用哪种方法储存的呢?
各人思考一下!!

#include <stdio.h>
int main()
{
        int a = 1;
        if (*(char*)&a == 1)
        {
                printf("小端");
        }
        return 0;
} 这里为什么要转化成char的情势呢?
由于char单位是一个字节,而我们所须要的也是第一个字节,以是将它转化一下更好的盘算。
这里还可以自界说一个函数,来实现判定,比力简朴就过多叙述了。  
2.

分析以下代码,盘算一下输出的效果。

char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a = %d, b = %d, c = %d", a, b, c);

https://i-blog.csdnimg.cn/direct/b2433d4ea9a04250b2ae755cade72408.png
不知道效果是否和你们一样呢 
为什么是如许的效果呢?
起首:注意变量的声明与初始化

[*]大多数体系中,char 默认是有符号的(即 signed char),但详细取决于编译器。大多数编译器(如VS2022)默认 char == signed char。。
其次 相识输出的格式

[*]        printf 函数的格式阐明符

[*]%d 用于打印有符号整数。
[*]%u 用于打印无符号整数。
       
接着:根据所学,知道内存储存的是补码,将他们盘算一下 
 10000000000000000000000000000001
 11111111111111111111111111111110
11111111111111111111111111111111  -1的补码
11111111 - a

11111111111111111111111111111111  -1的补码
1111111 - b

11111111111111111111111111111111  -1的补码
11111111 - c
 欧克将补码写出后就要盘算输出了%d形,如今是char,以是说要整形提升
发生整型提升
由于a,b都是有符号的以是说在前补1即可
11111111111111111111111111111111 - a
11111111111111111111111111111111 - b
这就是提升以后的补码,输出是原码
即 10000000000000000000000000000001   以是a b输出是-1
 那c呢,c是无符号型,无符号型提升的话,在前面补0即
00000000000000000000011111111 - c
这就是c提升后的补码,
注意如今开头是0,是正数,那么正数的原码 反码 补码都类似
以是输出是11111111 即255
2.1

在上面的标题上略加修改 %u
那么效果怎样呢
https://i-blog.csdnimg.cn/direct/2bde7eb10303411681cd508800f4af36.png 
奥哦,why?
有了上题的底子,应该是简朴了
1.   %u 用于打印无符号整数。
2. 既然是打印无符号的值, 那么不管是什么范例的,它的原码,反码,补码类似的 。
 11111111111111111111111111111111 - a
11111111111111111111111111111111 - b
00000000000000000000011111111 - c
总结:
本文相识了原码,反码,补码,以及巨细端字节序。
我们更好的相识了数据在内存的储存。
整形提升的规则总结

[*]有符号数:正数高位补0,负数高位补符号位。
[*]无符号数:高位补0。
[*]目的范例:通常为int范例,但假如int范例无法体现该值,则会扩展为long范例

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【C语言】巨细端字节序和字节序判定