将char填充到unsigned short:幕后会发生什么?

hb.*_*hb. 1 c c# casting

鉴于此字段:

char lookup_ext[8192] = {0}; // Gets filled later
Run Code Online (Sandbox Code Playgroud)

而这句话:

unsigned short *slt = (unsigned short*) lookup_ext;
Run Code Online (Sandbox Code Playgroud)

幕后发生了什么?

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++已经有一段时间了.

谢谢!

CB *_*ley 6

您显示的语句不会将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++代码更清洁,并在移植之前验证行为是否保持不变.

  • 通常,但他们不一定如此.例如,字符和无符号短路都可以是32位. (2认同)