鉴于此字段:
char lookup_ext[8192] = {0}; // Gets filled later
而这句话:
unsigned short *slt = (unsigned short*) lookup_ext;
幕后发生了什么?
lookup_ext [1669]返回67 = 0100 0011(C),lookup_ext [1670]返回78 = 0100 1110(N),lookup_ext [1671]返回68 = 0100 0100(D); 但是slt [1670]返回18273 = 0100 0111 0110 0001.
我想把它移植到C#,所以除了一个简单的方法,我也想知道这里到底发生了什么.我经常使用C++已经有一段时间了.
谢谢!
您显示的语句不会将char转换为unsigned short,它会将指向 char的指针转换为指向 unsigned short 的指针.这意味着指向数据的通常算术转换不会发生,并且当通过slt
变量访问时,底层char数据将被解释为unsigned short .
注意,sizeof(unsigned short)
不太可能是一个,因此slt[1670]
不一定对应lookup_ext[1670]
.更有可能 - 比方说,如果sizeof(unsigned short)
是两个 - 对应lookup_ext[3340]
和lookup_ext[3341]
.
你知道为什么原始代码使用这种别名吗?如果没有必要,可能值得尝试使C++代码更清洁,并在移植之前验证行为是否保持不变.