机器大端,小端的判别及int ,long, long long 尺寸大小的判别

------------------------------------------------------------
机器大端,小端的判别。
------------------------------------------------------------
#include <stdio.h>
#include <string.h>
unsigned char d[4]={
    0x12,0x34,0x56,0x78
}; // 我们知道,字符数组总是从低地址向高地址排列的.
int main()
{
    int *p=(int *)d;
    printf("d[0] addr:%p\n",&d[0]);
    printf("d[1] addr:%p\n",&d[1]);
    printf("data: %x\n",*p);  // 解引用,从内存中取数据
    return 0;
}

/* 内存中,0x12 在前(地址低位),这个12,到底是数据的高位还是低位呢?
/* 打印结果:
 * data: 78563412    12在数据低位,  低位在前, 叫little-endian, 翻译为小端,也有人叫小尾端,小端序. intel  cpu 如此排列
 * data  12345678    12是数据高位,   高位在前, 叫 big-endian , 翻译为大端,大尾端, 大端序. PowerPC 是大端序.
 * */
------------------------------------------------------------
int ,long, long long  尺寸大小的判别

------------------------------------------------------------[/pts/0@hjj ~/test]$ cat test.c

#include <stdio.h>
#include <unistd.h>

int main()
{
    int i=10;
    int j=11;
    long l=1;
    long long ll=2;
    printf("int size is %ld\n",sizeof(int));
    printf("long size is %ld\n",sizeof(long));
    printf("long long size is %ld\n",sizeof(long long));
    printf("i is %d, j is %d, l is %ld, ll is %lld\n",i,j,l,ll);
    printf("i is %p, j is %p, l is %p, ll is %p\n",&i,&j,&l,&ll);
    return 0;
}

以我的机器为例。我的机器cpu是64bits 的, 如下结果。

[/pts/0@hjj ~/test]$ ./test

int size is 4
long size is 8
long long size is 8
i is 10, j is 11, l is 1, ll is 2
i is 0x7ffe94075040, j is 0x7ffe94075044, l is 0x7ffe94075048, ll is 0x7ffe94075050

显而易见, int 大小为4, long 为8, long long 还是8 bytes, 即64bits

地址只用到了低位48bits.

 

linux 下,只需要查询ls 文件信息,便可立即判断出你机器是否是小端序,是几bits cpu

$which ls

/bin/ls

$file /bin/ls

/bin/ls: ELF 64-bit LSB shared object, x86-64

可见是64bit, x86-64, LSB(least significent bit first) 小端序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个C++函数,用于将long long类型的数据从大小端字节序转换为本机字节序或者从本机字节序转换为大小端字节序: ```c++ #include <cstdint> union EndianConverter { std::int64_t value; std::uint8_t bytes[sizeof(std::int64_t)]; }; std::int64_t SwapEndian(std::int64_t value) { EndianConverter converter; converter.value = value; for (std::size_t i = 0; i < sizeof(std::int64_t) / 2; ++i) { std::uint8_t tmp = converter.bytes[i]; converter.bytes[i] = converter.bytes[sizeof(std::int64_t) - i - 1]; converter.bytes[sizeof(std::int64_t) - i - 1] = tmp; } return converter.value; } ``` 在这个函数中,我们使用了一个联合体类型`EndianConverter`,它包含了一个`std::int64_t`类型的数据成员`value`和一个`std::uint8_t`类型的数组成员`bytes`,它们共享了同一块内存空间。我们首先将输入的数据值存入到`value`中,然后将其转换为一个字节数组`bytes`,并且通过交换数组中的字节顺序来进行字节序转换。最后,我们将转换后的字节数组重新组装成一个`std::int64_t`类型的数据,并且返回给调用者。 使用该函数,可以像下面这样将一个long long类型的数据从大端字节序转换为本机字节序: ```c++ std::int64_t value = 0x1122334455667788LL; std::int64_t swapped = SwapEndian(value); ``` 或者从本机字节序转换为大端字节序: ```c++ std::int64_t value = 0x1122334455667788LL; std::int64_t swapped = SwapEndian(value); std::int64_t big_endian = SwapEndian(swapped); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值