为什么64位PC机上 long的高位不为0?

bandaoyu 2020-01-02 09:53:49
定义一个long的变量,赋值,然后用字节指针poc指向,查看每一个字节的内容,发现高字节竟然不是0!!见图, 为什么?


typedef unsigned long int uint64_t;
……
uint64_t longitude;
……
uint8_t* poc;

st_staion_cfg.longitude = 71000;


poc = (uint8_t*)(&st_staion_cfg.longitude);

for (index = 0; index < 8; index++)
{
pl_buf[loc + index] = poc[index];
}

loc += 8;

...全文
384 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2020-03-04
  • 打赏
  • 举报
回复
问题关闭,谢谢大家的回复,内容概要已经转到我的博客:https://mp.csdn.net/console/editor/html/103819937,大家还有什么回复可以到博客留言
bandaoyu 2020-01-03
  • 打赏
  • 举报
回复
二.可能原因 编译器的数据模型

Datetype LP64 ILP64 LLP64 ILP32 LP32

char 8 8 8 8 8

short 16 16 16 16 16

int 32 64 32 32 16

long 64 64 32 32 32

long long 64

pointer 64 64 64 32 32

一般情况下windows64位一般使用LLP64模型

64位Unix,Linux使用的是LP64模型
————————————————
版权声明:本文为CSDN博主「编程吴彦祖」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/akyj1021/article/details/81432758
  • 打赏
  • 举报
回复
windows上的64位编译器普遍使用LLP64模型(包括GCC的windows移植MinGW64),只有long long和指针是64位的,其他和32位编译器一致,是为了最大化兼容性的缘故。unix、linux上的64位编译器则主要使用LP64模型,long、long long和指针都是64位的,int保持32位,少部分使用ILP64模型,甚至SILP64,连short都是64位的,典型如CRAY的UNICOS系统上带的编译器。
bandaoyu 2020-01-03
  • 打赏
  • 举报
回复
引用 6 楼 寻开心 的回复:
引用 5 楼 真相重于对错 的回复:
vs long long 才是64
正解
寻开心 2020-01-02
  • 打赏
  • 举报
回复
引用 5 楼 真相重于对错 的回复:
vs long long 才是64



windows系统,msdn下有一个页面
该信息也可用于各种Windows头文件中WinDef.h。我在这里列出了一些相关的类型:

类型| S / U | x86 | 64位
----------------------------+-----+--------+-------
BYTE,BOOLEAN | U | 8位| 8位
----------------------------+-----+--------+-------
SHORT | S | 16位| 16位
USHORT,WORD | U | 16位| 16位
----------------------------+-----+--------+-------
INT,LONG | S | 32位| 32位
UINT,ULONG,DWORD | U | 32位| 32位
----------------------------+-----+--------+-------
INT_PTR,LONG_PTR,LPARAM | S | 32位| 64位
UINT_PTR,ULONG_PTR,WPARAM | U | 32位| 64位
----------------------------+-----+--------+-------
LONGLONG | S | 64位| 64位
ULONGLONG,QWORD | U | 64位| 64位


而Linux或者Unix下面 针对64位平台的整数和指针的大小有一些可能的安排。其中最常用的两个是ILP64(实际上,这只是其中的一小部分例子,Cray就是这样)和LP64(几乎所有其他的)。首字母来自'int,long,指针是64位'和'long,指针是64位'。

Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64

看来还是不能假定这玩意儿的大小,还是实测为准啊
真相重于对错 2020-01-02
  • 打赏
  • 举报
回复
vs long long 才是64
bandaoyu 2020-01-02
  • 打赏
  • 举报
回复
引用 2 楼 寻开心 的回复:
你这个long int到底是几啊
从你代码上看不出来它的值
从你的输出结果上开,这个long的低四位是710000, 就是16进制的0x00 01 15 58
高位4个字节,看不出来你给设置上了什么东西, 从输出结果上看是0x00 01 3c 68 , 十进制的810000

估计你是弄错了10进制和16进制的区别
0x710000, 0x810000,合并起来long的高位才会是1


找到原因了,应该和VS的问题,VS我已经配置 X64,为什么还是32位?

printf("size is %d\n", sizeof(long int));
printf("size is %d\n", sizeof(long));

这两个打印出来的都是 4)

bandaoyu 2020-01-02
  • 打赏
  • 举报
回复
找到原因了,应该和VS的问题,VS我已经配置 X64,为什么还是32位?

printf("size is %d\n", sizeof(long int));
printf("size is %d\n", sizeof(long));

这两个打印出来的都是 4)

寻开心 2020-01-02
  • 打赏
  • 举报
回复
你这个long int到底是几啊
从你代码上看不出来它的值
从你的输出结果上开,这个long的低四位是710000, 就是16进制的0x00 01 15 58
高位4个字节,看不出来你给设置上了什么东西, 从输出结果上看是0x00 01 3c 68 , 十进制的810000

估计你是弄错了10进制和16进制的区别
0x710000, 0x810000,合并起来long的高位才会是1

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧