C# 向未签名的短字符施放字符:幕后发生了什么?

C# 向未签名的短字符施放字符:幕后发生了什么?,c#,c,casting,C#,C,Casting,鉴于这一领域: 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

鉴于这一领域:

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=01000111 01100001

我正试图把它移植到C#,所以除了一个简单的方法,我还想知道这里到底发生了什么。自从我经常使用C++以来,已经有一段时间了。
谢谢

如果我理解正确,类型转换将把大小为8192的char数组转换为大小为其一半的短int数组,即4096


所以我不明白你在问什么。slt[1670]应对应于查找扩展[1670*2]和查找扩展[1670*2+1]

如果我理解正确,类型转换将把大小为8192的char数组转换为大小为其一半的短int数组,即4096


所以我不明白你在问什么。slt[1670]应对应于查找扩展[1670*2]和查找扩展[1670*2+1]

您显示的语句不会将char强制转换为无符号short,而是将char指针强制转换为无符号short指针。这意味着指向数据的常规算术转换将不会发生,并且当通过
slt
变量访问时,底层char数据将被解释为无符号短字符

请注意,
sizeof(unsigned short)
不太可能是一个,因此
slt[1670]
不一定对应于
lookup\u ext[1670]
。例如,如果
sizeof(unsigned short)
是两个,则更可能对应于
lookup\u ext[3340]
lookup\u ext[3341]


您知道原始代码为什么使用此别名吗?如果不是必需的,在移植前,尝试使C++代码更干净并验证行为是不变的。这意味着指向数据的常规算术转换将不会发生,并且当通过
slt
变量访问时,底层char数据将被解释为无符号短字符

请注意,
sizeof(unsigned short)
不太可能是一个,因此
slt[1670]
不一定对应于
lookup\u ext[1670]
。例如,如果
sizeof(unsigned short)
是两个,则更可能对应于
lookup\u ext[3340]
lookup\u ext[3341]

您知道原始代码为什么使用此别名吗?如果不需要,在尝试移植之前,尝试使C++代码更干净,并验证行为是不变的。< / P> < P>当您执行“无符号短SLT =(无符号短)查找表”时,从LoopUpExt所给出的位置拾取与(未签名短)大小相等的字节数,并存储在slt指向的位置。由于unsigned short将是2个字节,lookup_ext中的前两个字节将存储在slt给定的位置。

当您执行“unsigned short slt=(unsigned short)lookup_ext;”时,将从lookup_ext给定的位置提取与(unsigned short)大小相等的字节数,并存储在slt指向的位置。由于unsigned short将是2个字节,所以lookup_ext中的前两个字节将存储在slt给定的位置。

好的,下面的语句

char lookup_ext[8192] = {0}; // Gets filled later
根据定义出现的位置,在本地或非本地创建数组。像这样初始化它,使用聚合初始值设定项将其所有元素初始化为零(第一个显式,其余的隐式)。因此,我想知道为什么您的程序输出非零值。除非填充发生在读取之前,否则这是有意义的

unsigned short *slt = (unsigned short*) lookup_ext;
这将在从指针的目标读取时,将构成数组的字节解释为无符号短对象。严格地说,上面的行为是未定义的,因为您无法确定数组是否适合对齐,并且您将从不指向原始指针类型(unsigned char unsigned short)的指针读取。在C++中,唯一的可移植的方法是从其他的POD(普通的旧数据)中读取值,这是C中可能的所有结构和简单类型(如广义上的简短),就是使用这样的库函数:<代码> MycPy < /C> >或<代码> MeMaung。p> 因此,如果您阅读上面的
*slt
,您将解释数组的第一个
sizeof(*slt)
字节,并尝试将其读取为无符号短字节(这称为
类型pun

char lookup_ext[8192] = {0}; // Gets filled later
根据定义出现的位置,在本地或非本地创建数组。像这样初始化它,使用聚合初始值设定项将其所有元素初始化为零(第一个显式,其余的隐式)。因此,我想知道为什么您的程序输出非零值。除非填充发生在读取之前,否则这是有意义的

unsigned short *slt = (unsigned short*) lookup_ext;
这将在从指针的目标读取时,将构成数组的字节解释为无符号短对象。严格地说,上面的行为是未定义的,因为您无法确定数组是否适合对齐,并且您将从不指向原始指针类型(unsigned char unsigned short)的指针读取。在C++中,唯一的可移植的方法是从其他的POD(普通的旧数据)中读取值,这是C中可能的所有结构和简单类型(如广义上的简短),就是使用这样的库函数:<代码> MycPy < /C> >或<代码> MeMaung。p> 因此,如果您阅读上面的
*slt
,您将解释第一个
sizeof(*slt)