看看这个C#代码:
byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'
Run Code Online (Sandbox Code Playgroud)
对byte(或short)类型执行的任何数学运算的结果都隐式地转换回整数.解决方案是将结果显式地转换回一个字节:
byte z = (byte)(x + y); // this works
Run Code Online (Sandbox Code Playgroud)
我想知道的是为什么?它是建筑吗?哲学?
我们有:
int+ int=intlong+ long=longfloat+ float=floatdouble+ double=double那么为什么不呢:
byte+ byte=byteshort+ short= short?一点背景:我正在对"小数字"(即<8)执行一长串计算,并将中间结果存储在一个大数组中.使用字节数组(而不是int数组)更快(因为缓存命中).但是通过代码传播的大量字节转换使得它更加难以理解.
C#中的程序:
short a, b;
a = 10;
b = 10;
a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'.
// we can also write this code by using Arithmetic Assignment Operator as given below
a += b; // But this is running successfully, why?
Console.Write(a);
Run Code Online (Sandbox Code Playgroud) 我正在尝试将两个字节转换为无符号短路,以便我可以检索实际的服务器端口值.我是根据回复格式下的协议规范做出的.我尝试使用BitConverter.ToUint16(),但问题是,它似乎没有抛出预期值.请参阅下面的示例实现:
int bytesRead = 0;
while (bytesRead < ms.Length)
{
int first = ms.ReadByte() & 0xFF;
int second = ms.ReadByte() & 0xFF;
int third = ms.ReadByte() & 0xFF;
int fourth = ms.ReadByte() & 0xFF;
int port1 = ms.ReadByte();
int port2 = ms.ReadByte();
int actualPort = BitConverter.ToUInt16(new byte[2] {(byte)port1 , (byte)port2 }, 0);
string ip = String.Format("{0}.{1}.{2}.{3}:{4}-{5} = {6}", first, second, third, fourth, port1, port2, actualPort);
Debug.WriteLine(ip);
bytesRead += 6;
}
Run Code Online (Sandbox Code Playgroud)
给定一个样本数据,假设对于两个字节值,我有105和135,转换后的预期端口值应该是27015,而是使用BitConverter得到值34665.
我这样做是错误的吗?
如果我有两个byte小号a和b,怎么来的:
byte c = a & b;
Run Code Online (Sandbox Code Playgroud)
关于将byte转换为int会产生编译器错误?它这样做,即使我把一个显式类型转换前面a和b.
另外,我知道这个问题,但我真的不知道它是如何应用的.这似乎是一个返回类型的问题operator &(byte operand, byte operand2),编译器应该能够像任何其他运算符一样进行排序.
例如,为什么long int有一个文字修饰符,但是short int不是?我指的是这个网站上的以下问题:C#编译器编号文字
通常,C#似乎是一种设计良好且一致的语言.可能有一个强有力的理由为某些类型提供文字修饰符,但不是所有类型.它是什么?
在.Net框架DateTime结构中,Year被定义为int(实际上是System.Int32).但是,MSDN文档说该值始终介于1和9999之间.因此,ushort(System.UInt16)足以存储该值并占用一半的空间.那么为什么它是一个int而不是一个ushort呢?
有一个从ushort到int的隐式转换,因此在Year上不需要进行转换来进行整数运算.
我意识到这是一个微优化问题,因此不是很重要.我只是好奇.
版本:Visual Studio Professional 2013 Update 4
构建参数:首选32位为真
我不明白以下C#代码中的错误:
short iCount = 20;
short iValue = iCount + (short)1;
Run Code Online (Sandbox Code Playgroud)
将short添加到转换为short的int会导致以下错误:
无法将类型'int'隐式转换为'short'.存在显式转换(您是否错过了演员?)
上面的错误,在下面的例子中也可以看到,在这里完全有效:
short iCount = 20;
short iValue = iCount + 1;
Run Code Online (Sandbox Code Playgroud)
以下解决方法将删除错误:
short iCount = 20;
short iValue = (short)(iCount + 1);
Run Code Online (Sandbox Code Playgroud)
因此,"short + Int32 constant"形式的加法显然有效,结果是Int32,需要将其缩短.
有没有解释为什么第一个代码示例失败或者这是编译器错误?(在4次更新后我几乎无法相信)
该unchecked关键字已在MSDN库中解释为:
unchecked关键字用于抑制整数类算术运算和转换的溢出检查.在未经检查的上下文中,如果表达式生成的值超出目标类型的范围,则不会标记溢出.
根据定义,它在int类型上运行良好.
例如:
unchecked
{
int i=2147483647+10;
}
Run Code Online (Sandbox Code Playgroud)
这里它抑制了未经检查的块内的溢出.(它应该是)
但是当我们在字节上应用它时它不起作用
byte b1=100,b2=100,b3;
unchecked
{
b3=b1+b2;//error here
}
Run Code Online (Sandbox Code Playgroud)
因此,应该抑制在未经检查的环境中编写的任何内容.
为什么它会给出编译时错误?
或者我根本不理解未经检查的关键字?
字节优化给你带来多大的性能提升(使它们成为8,32,64等的倍数......)?
这是一个示例结构:
[StructLayout(LayoutKind.Explicit)]
public struct RenderItem
{
[FieldOffset(0)] byte[] mCoordinates = new byte[3]; //(x,y,z)
[FieldOffset(3)] short mUnitType;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,做这样的事情有多重要:
[StructLayout(LayoutKind.Explicit)]
public struct RenderItem
{
[FieldOffset(0)] byte[] mCoordinates = new byte[3]; //(x,y,z)
[FieldOffset(4)] short mUnitType;
[FieldOffset(6)] byte[] mPadding = new byte[2]; //make total to 8 bytes
}
Run Code Online (Sandbox Code Playgroud)
我敢肯定它是那些"随尺寸扩展"的东西之一,所以特别是我很好奇这个结构会被用来创建一个VertexBuffer对象大约150,000次:
//int objType[,,] 3 dimensional int with object type information stored in it
int i = 0;
RenderItem vboItems[16 * 16 * 16 * 36] //x - 16, y - 16, z - 16, …Run Code Online (Sandbox Code Playgroud) 我刚发现这个:
ushort i = 4;
i = i + 4;
Run Code Online (Sandbox Code Playgroud)
给出编译错误:
无法将类型'int'隐式转换为'ushort'.存在显式转换(您是否错过了演员?)
我必须这样解决它:
ushort i = 4;
i = (ushort)(i + 4);
Run Code Online (Sandbox Code Playgroud)
这背后的原因是什么?难道不应该明显且易于使用所有数据类型吗?