首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中整数转换的语法

C#中整数转换的语法
EN

Stack Overflow用户
提问于 2014-01-24 02:11:03
回答 5查看 238关注 0票数 1

在C中,我认为这三种说法都是相同的。

  1. 单行(或者,对我自己来说太简洁了?): //不能隐式地将类型'int‘转换为'ushort’。存在显式转换(是否缺少强制转换?)返回(UInt16)(r1 << 8) x (UInt16)(r);
  2. 不可接受的三重奏: //不能隐式地将类型'int‘转换为'ushort’。一个显式转换存在UInt16 ret = r;ret = ret = (UInt16)(r1 << 8);
  3. 可接受的三重奏: UInt16 ret = r;ret |= (UInt16)(r1 << 8);

我错过了什么演员?

供参考,完整的功能:

代码语言:javascript
运行
复制
public UInt16 read_word(byte addr, byte cmd, string descr = "")
{
    byte[] w = { cmd };
    byte[] r = read_write(addr, w, 2);
    // I can't figure out why the compiler rejects this statement:
    // return (UInt16)(r[1] << 8) | (UInt16)(r[0]);
    UInt16 ret = r[0];
    // The compiler also rejects this:
    // ret = ret | (UInt16)(r[1] << 8);
    // But, the compiler accepts this:
    ret |= (UInt16)(r[1] << 8);
    return ret;
}
EN

回答 5

Stack Overflow用户

发布于 2014-01-24 02:45:52

它在c#规范中得到了描述:

4.1.5积分类型

  • 对于二进制+*/%&^|==!=><>=<=操作符,操作数转换为T,其中Tintuintd24和d25的第一个操作数,可以完全表示两个操作数的所有可能值。然后使用T类型的精度来执行操作,结果的类型是T (或关系操作符的bool )。不允许一个操作数为long类型,另一个操作数为带有二进制运算符的ulong类型。
  • 对于二进制<<和>>运算符,左操作数转换为T类型,其中T是int、uint、long和ulong中的第一个操作数,可以完全表示操作数的所有可能值。然后使用T类型的精度执行操作,结果的类型为T。

因此,当您试图在<<上执行UInt16时,它首先被转换为int,因为这是第一个能够完全表示UInt16的所有可能值的int。返回的值也是int。这就是为什么您必须再次将结果转换为UInt16的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-01-24 02:30:32

在C#中,使用字节或短的按位运算符将导致隐式转换为int。

我认为以下几点是可行的:

代码语言:javascript
运行
复制
return (UInt16)(r[1] << 8 | r[0]);

ret = (UInt16)(ret | (r[1] << 8));
票数 0
EN

Stack Overflow用户

发布于 2014-01-24 02:31:44

我认为问题在于|运算符不是为Uint16定义的。(MSDN说表示它只为整数类型和Uint16 是一个结构定义)所以我相信您在这一行中得到了类型提升:

代码语言:javascript
运行
复制
ret |= (UInt16)(r[1] << 8);

返回到int,然后在返回它时(从int返回到UInt16 ):

代码语言:javascript
运行
复制
return ret;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21323128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档