unsigned u = 10;
int i = -42;
std::cout << u + i << std::endl;
对于上述C++代码段,输出结果 4294967264.
原因:int由于与有符号变量u进行加法运算,C++编译器将进行类型转换,i的值变为 2^32 - 42 +1成为一个有符号数值然后与u相加得到结果。
C#
uint g = 10;
int h = -42;
Console.WriteLine(g+h);
C#进行此运算得到正常结果值 -32
C# short类型或者小于int类型的数值运算
short a = short.MaxValue;
short b = short.MaxValue;
Console.WriteLine(a + b);
得到结果65534,因为short最大值为32767.比较反直觉的是 此处应该发生算数溢出。而由于C#的数值运算,小于int类型的数值统统都会转成int进行运算。所以没有发生溢出。 想要看溢出的结果可以用下列代码段
int c = int.MaxValue;
int d = int.MaxValue;
Console.WriteLine(c + d);
C#也依然存在 无符号数转型发生不符合直觉的结果
short f = 12345;
ushort e = (ushort)-f;
Console.WriteLine($"f={f}\t d={e}");
此处 直觉认为应该还是12345,结果却为53191。也是由于无符号转换为有符号,进行了反码到原码的转换 得到了53191