【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]