c指针大端小端还有内存字节对齐问题

#今天网易云给我推荐的音乐很是奇怪,都是粤语,保持微笑喔,:)老娘心里很气。而且都是情歌之类这个网易云算法有问题

/*
author:久久
*/
#include<stdio.h>
struct s1
{
    char a;
    char b;
    char c;
    char d;
};
int main( void )
{
    struct s1 s=
    {
        1,
        2,
        3,
        4
    };
    
    struct s1* p=&s;
    
    printf("输出:%08x\n",*p);
           
    return 0;
}

代码是久久的,我们昨天讨论的是这个输出问题,这个代码是最初的 ,最原始的。先不说后来创新的。输出是04030201.

既然这里有标准输出格式,那我也顺带写写从前是不管这些的 喏,反正之前人类考过。充分暴露了我的不学无术

printf("%08x",*p)输出8位16进制无符号数,左边补0

输出:04030201

p指针指向的是结构体s1,刚好s1里有4个字符 1 2 3 4所以它输出 04030201 我们就这样勉强理解吧(哈哈哈,勉强勉强,假装有道理)那为什么不是01020304 而是反着的呢,其实我想知道的是为什么后面3个数字之前会有0 ,这个0和我们定义的格式里自动补0是没有关系的啦。

为什么是这样输出呢,人类说是大端小端问题。

解释下什么叫大端小端。第一次听到这个词是在socket编程,(就是写代码利用tcp ip之类还有些乱七八糟的api模拟网络发消息,你们自己看到就百度,当然不是我这样瞎讲),里 有个htons 我做的笔记是:调用htons把本地主机字节序转为网络字节序,因为本地字节采取的是小端模式,网络字节采取的是大端模式。

终于到正题了,什么是大端模式,什么是小端模式呢。

大端字节序 就是低位字节放在高地址,数据的高位字节放在低地址

小端字节序 就是低位字节放在低地址,高位字节放在高地址

"只有读取的时候,才必须区分字节序,其他情况都不用考虑。"-摘自http://www.baidu.com/link?url=Ys7dcKA3dPYGEuG0LGy3NIt5vGpb6u5BlqszhR6xaLSzngWUnyrYcz2aH5Ph3GTSBgJwPtZAi8-6-E6GeVRAmq&wd=&eqid=cf9c082d000036e4000000055aec10f8

然后问题来了:对于一个数据来讲什么叫 低位 高位呢  一个数左边的就是高位,右边的是低位 (你们就这样勉强看看吧,哈哈哈)比如 1234 12算高34算低 吧,

所以基于小端字节 最后输出 是04030201  至于内存地址高低     这又是个复杂问题,,似乎高位字节所在就是高地址,这不是废话么,惊讶 哈哈哈,溜了,这些超出我目前范围了,最后抱怨下,没事搞这么复杂干嘛,干嘛,欺负我不读书、

大家去看这个人类的吧,感觉他写的很有道理的样子,某个人类写的关于大端小端低地址高地址

--------------------------------------------------

今天又特地问了遍人类 ,一个指针如果指向一个结构体,那么对这个结构体指针取地址 得到的是什么,人类说结构体的首地址就是结构体首元素的地址 至于这个为什么这样输出 是因为 格式化字符串%不会管你是什么类型,他只管把需要的内存长度取出来,按给定格式输出 x是int长度,会取4个字节,刚好这个结构体大小是4个字节。。。。。。我还是不是很明白,但是有个看起来正常一点点的解释了。(就这样,以后再明白了一点就继续补充)

猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/80193959