2736946915 发表于 2021-10-3 13:09:18

int 转 long long的内存问题

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吧????

所以,底层到底是怎么转的???{:10_257:}

人造人 发表于 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

人造人 发表于 2021-10-3 13:28:36

人造人 发表于 2021-10-3 13:31:57

人造人 发表于 2021-10-3 13:38:01

人造人 发表于 2021-10-3 13:39:24

cdq 指令
eax 保持不变
edx 填充成 eax 的符号位,符号位为 1,edx 就全 1,符号位为 0,edx 就全 0

人造人 发表于 2021-10-3 13:45:22

2736946915 发表于 2021-10-3 15:54:48

人造人 发表于 2021-10-3 13:28


这和补码差不多,不过没有反转的话,读取8位值就变了啊,longlong8字节,总不可能4字节的解读把

人造人 发表于 2021-10-3 16:01:20

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

没有明白你的问题,举例说明你的问题

jhq999 发表于 2021-10-3 16:22:53

本帖最后由 jhq999 于 2021-10-3 16:25 编辑

人造人 发表于 2021-10-3 13:38

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

空白的地方用需要被转换的符号位的值填充

人造人 发表于 2021-10-3 16:28:44

jhq999 发表于 2021-10-3 16:22
我理解:
char a=11111110b;\\-2
char b=00000010b;\\2


对呀,没问题呀
我上面的回复,你那里没有看懂吗?

人造人 发表于 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

人造人 发表于 2021-10-3 16:30:31

jhq999 发表于 2021-10-3 16:22
我理解:
char a=11111110b;\\-2
char b=00000010b;\\2


抱歉,看错人了,^_^

2736946915 发表于 2021-10-3 16:44:31

人造人 发表于 2021-10-3 16:01
没有明白你的问题,举例说明你的问题

~取反

人造人 发表于 2021-10-3 16:48:33

2736946915 发表于 2021-10-3 16:44
~取反

没有明白你的问题,举例说明你的问题

2736946915 发表于 2021-10-3 16:49:06

人造人 发表于 2021-10-3 16:01
没有明白你的问题,举例说明你的问题

比如1和-1的内存状态,就是
1:    00000001
取反: 11111110
-1:   11111111
1没有补码他变不了-1,所以前面4位变成1后,整体数值也变化了,但是系统的值却能不变的情况下转换

人造人 发表于 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

不明白你说的什么取反


2736946915 发表于 2021-10-3 17:08:29

人造人 发表于 2021-10-3 16:55
1
8 位
0000 0001


这就是补码啊

2736946915 发表于 2021-10-3 17:10:28

人造人 发表于 2021-10-3 16:55
1
8 位
0000 0001


“~”这个符号...

人造人 发表于 2021-10-3 17:10:49

2736946915 发表于 2021-10-3 17:08
这就是补码啊

没有明白你的问题,举例说明你的问题
页: [1] 2
查看完整版本: int 转 long long的内存问题