C++与C#对于有无符号数值运算的区别

3 篇文章 0 订阅
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值