在C中,确实如此:
[8-bit] signed char: -127 to 127
[8-bit] unsigned char: 0 to 255
Run Code Online (Sandbox Code Playgroud)
但是在记忆中真的发生了什么?是一个带有二进制补码的带符号的char和一个没有任何特定表示的无符号字符(即11111111的序列)?
可执行文件如何跟踪它正在读取的变量类型,以确定CPU寄存器中的值是否被解释为两个补码?是否有一些元数据将变量名称与其类型相关联?
谢谢!
没有元数据.最终执行由底层硬件完成,因为编译器在对这些类型执行某些操作时使用不同的指令.比较装配时,它会变得更加明显.
void test1()
{
char p = 0;
p += 3;
}
void test2()
{
unsigned char p = 0;
p += 3;
}
Run Code Online (Sandbox Code Playgroud)
你在这里看到的是由上面发布的源代码编译器编译的指令.编译没有优化-O0这是创建的clang 3.7程序集.如果您不熟悉,可以忽略大部分说明.继续关注movsx和movzx.这两条指令区别对待内存位置的方式.
test1(): # Instructions for test1
push rbp
mov rbp, rsp
mov byte ptr [rbp - 1], 0
movsx eax, byte ptr [rbp - 1] <-- Move byte to word with sign-extension
add eax, 3
mov cl, al
mov byte ptr [rbp - 1], cl
pop rbp
ret
test2(): # Instructions for test2
push rbp
mov rbp, rsp
mov byte ptr [rbp - 1], 0
movzx eax, byte ptr [rbp - 1] <-- Move byte to word with zero-extension
add eax, 3
mov cl, al
mov byte ptr [rbp - 1], cl
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |