我有一个非常简单的问题,让我非常头疼,因为我将一些代码从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数组的格式有关 - 但最终如果有人能给我一个明确的答案,我将不胜感激。
提前感谢您的帮助。
大卫
答案 0 :(得分:3)
C ++中的溢出,C#中的无溢出。
在C#中,char
是两个字节。在C ++中,char
是一个字节!
因此在C#中,没有溢出,并保留该值。在C ++中,存在积分溢出。
将数据类型从char
更改为uint16_t
或unsigned 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)
答案 5 :(得分:0)
-8和248之间的区别在于你如何解释数据。它们存储完全相同(0xF8)。在C ++中,默认的char类型是'signed'。所以,0xF8 = -8。如果您将数据类型更改为'unsigned char',它将被解释为248. VS还有一个编译器选项,使'char'默认为'unsigned'。