ANDING和赋予C ++和C#中char数组的uint时的不同值

时间:2011-09-07 20:20:15

标签: c# c++

我有一个非常简单的问题,让我非常头疼,因为我将一些代码从C ++移植到C#中,对于一个非常简单的操作,我得到了完全不同的结果: -

C ++

char OutBuff[25];       
int i;
unsigned int SumCheck = 46840;

OutBuff[i++] = SumCheck & 0xFF; //these 2 ANDED make 248

写入char数组的值是-8

C#

char[] OutBuff = new char[25]; 
int i;
uint SumCheck = 46840;
OutBuff[i++] = (char)(sumCheck & 0xFF); //these 2 ANDED also make 248

写入char数组的值为248。

有趣的是它们都是相同的字符,所以这可能与C ++和C#中char数组的格式有关 - 但最终如果有人能给我一个明确的答案,我将不胜感激。

提前感谢您的帮助。

大卫

6 个答案:

答案 0 :(得分:3)

C ++中的溢出,C#中的无溢出

在C#中,char两个字节。在C ++中,char一个字节!

因此在C#中,没有溢出,并保留该值。在C ++中,存在积分溢出。

将数据类型从char更改为uint16_tunsigned char(在C ++中),您会看到相同的结果。请注意,unsigned char的值可以为248,不会溢出。事实上,它的价值最高为255

答案 1 :(得分:2)

也许你应该使用byte或sbyte而不是char。 (char仅用于存储文本字符,而char的实际二进制序列化与c ++中的字符串不同.char允许我们存储字符而不必担心字符字节宽度。)

答案 2 :(得分:1)

C# char is actually 16 bits,而C ++ char 通常 8位(a char is exactly 8 bits on Visual C++)。所以你在C ++代码中实际上是overflowing the integer,但C#代码不会溢出,因为它包含更多位,因此具有更大的整数范围。

请注意,248超出了签名char(-128到127)的范围。这应该会给你一个提示,即C#的char可能大于8位。

如果你想保留行为,你可能想要使用C#'s sbyte(最接近Visual C ++的char)。虽然您可能想要重新检查代码,因为C ++实现中发生了溢出。

答案 3 :(得分:0)

正如大家所说,在C#中,char是16位,而在C ++中,它通常是8位。

二进制的

-8和248(基本上)都是这样的:

11111000

因为C ++中的char通常是8位(实际上是你的情况),结果是-8。在C#中,值如下所示:

00000000 11111000

这是16位,变为248。

答案 4 :(得分:0)

-8的{p> 2's complement representation与248(无符号)的二进制表示相同 因此二元表示在两种情况下都是相同的。 c ++被解释为int8结果,在c#中它只是被解释为一个正整数(int是32位,通过转换为char而截断为16不影响这种情况下的符号)

答案 5 :(得分:0)

-8和248之间的区别在于你如何解释数据。它们存储完全相同(0xF8)。在C ++中,默认的char类型是'signed'。所以,0xF8 = -8。如果您将数据类型更改为'unsigned char',它将被解释为248. VS还有一个编译器选项,使'char'默认为'unsigned'。