鱼C论坛

 找回密码
 立即注册
查看: 2748|回复: 20

int 转 long long的内存问题

[复制链接]
发表于 2021-10-3 13:09:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int 占4字节
long long占8字节
int a=100;
long long b = (long long)a;

问题来了,4字节的int类型转成8字节的longlong类型,它的内存发生了什么变化?
1.如果是读取后面4个字节,那么又不能确保后面的值是00,
2.如果是重新分配+cpy,那么地址本身又未发生任何变化,
3.还有利用栈来传递数据,把int的值放入栈区,然后在转给longlong,空的4字节用0填充,

汇编是用了cdq 拓展指令,
这个指令原理又是什么,不可能凭空就能4转8吧????

所以,底层到底是怎么转的???
I]X]ORU{5HB(A7E[)SE(34R.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-3 13:26:41 | 显示全部楼层
看最高位
如果最高位是 0,那就 8 字节的 高 4 字节全部为 0,低 4 字节不变
123
4 字节
0000 0000 0000 0000 0000 0000 0111 1011
8 字节
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 1011

对齐了看起来好点
                                                                0000 0000 0000 0000 0000 0000 0111 1011
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 1011

如果最高位是 1,那就 8 字节的 高 4 字节全部为 1,低 4 字节不变

-123
4 字节
1111 1111 1111 1111 1111 1111 1000 0101
8 字节
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000 0101

对齐一下看起来更直观
                                                                1111 1111 1111 1111 1111 1111 1000 0101
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000 0101
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 13:28:36 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 13:31:57 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 13:38:01 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 13:39:24 | 显示全部楼层
cdq 指令
eax 保持不变
edx 填充成 eax 的符号位,符号位为 1,edx 就全 1,符号位为 0,edx 就全 0

2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 13:45:22 | 显示全部楼层
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 15:54:48 | 显示全部楼层

这和补码差不多,不过没有反转的话,读取8位值就变了啊,longlong8字节,总不可能4字节的解读把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:01:20 | 显示全部楼层
2736946915 发表于 2021-10-3 15:54
这和补码差不多,不过没有反转的话,读取8位值就变了啊,longlong8字节,总不可能4字节的解读把

没有明白你的问题,举例说明你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:22:53 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-3 16:25 编辑

我理解:
char a=11111110b;\\-2
char b=00000010b;\\2
short c=(short)a;\\c=11111111 11111110b
short c=(short)b;\\c=00000000 00000010b

空白的地方用需要被转换的符号位的值填充
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:28:44 | 显示全部楼层
jhq999 发表于 2021-10-3 16:22
我理解:
char a=11111110b;\\-2
char b=00000010b;\\2

对呀,没问题呀
我上面的回复,你那里没有看懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:29:29 | 显示全部楼层
jhq999 发表于 2021-10-3 16:22
我理解:
char a=11111110b;\\-2
char b=00000010b;\\2

还有

char a=11111110b;//-2
char b=00000010b;//2
short c=(short)a;//c=11111111 11111110b
short c=(short)b;//c=00000000 00000010b
不是
char a=11111110b;\\-2
char b=00000010b;\\2
short c=(short)a;\\c=11111111 11111110b
short c=(short)b;\\c=00000000 00000010b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:30:31 | 显示全部楼层
jhq999 发表于 2021-10-3 16:22
我理解:
char a=11111110b;\\-2
char b=00000010b;\\2

抱歉,看错人了,^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 16:44:31 | 显示全部楼层
人造人 发表于 2021-10-3 16:01
没有明白你的问题,举例说明你的问题

~取反
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:48:33 | 显示全部楼层

没有明白你的问题,举例说明你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 16:49:06 | 显示全部楼层
人造人 发表于 2021-10-3 16:01
没有明白你的问题,举例说明你的问题

比如1和-1的内存状态,就是
1:    00000001
取反: 11111110
-1:   11111111
1没有补码他变不了-1,所以前面4位变成1后,整体数值也变化了,但是系统的值却能不变的情况下转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 16:55:05 | 显示全部楼层
2736946915 发表于 2021-10-3 16:49
比如1和-1的内存状态,就是
1:    00000001
取反: 11111110

1
8 位
0000 0001
16 位
0000 0000 0000 0001
32 位
0000 0000 0000 0000 0000 0000 0000 0001
64 位
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

-1
8 位
1111 1111
16 位
1111 1111 1111 1111
32 位
1111 1111 1111 1111 1111 1111 1111 1111
64 位
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

不明白你说的什么取反


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 17:08:29 | 显示全部楼层

这就是补码啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 17:10:28 | 显示全部楼层

“~”这个符号...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 17:10:49 | 显示全部楼层

没有明白你的问题,举例说明你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 00:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表