相关疑难解决方法(0)

byte + byte = int ...为什么?

看看这个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=int
  • long+ long=long
  • float+ float=float
  • double+ double=double

那么为什么不呢:

  • byte+ byte=byte
  • short+ short= short

一点背景:我正在对"小数字"(即<8)执行一长串计算,并将中间结果存储在一个大数组中.使用字节数组(而不是int数组)更快(因为缓存命中).但是通过代码传播的大量字节转换使得它更加难以理解.

c# type-conversion

356
推荐指数
8
解决办法
6万
查看次数

整数蓝色,短+ +短问题

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)

c# int types short

68
推荐指数
4
解决办法
1万
查看次数

在C#中将2个字节转换为Short

我正在尝试将两个字节转换为无符号短路,以便我可以检索实际的服务器端口值.我是根据回复格式下的协议规范做出的.我尝试使用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.

我这样做是错误的吗?

c# arrays byte short

25
推荐指数
3
解决办法
3万
查看次数

为什么C#的二元运算符总是返回int而不管它们的输入格式如何?

如果我有两个byte小号ab,怎么来的:

byte c = a & b;
Run Code Online (Sandbox Code Playgroud)

关于将byte转换为int会产生编译器错误?它这样做,即使我把一个显式类型转换前面ab.

另外,我知道这个问题,但我真的不知道它是如何应用的.这似乎是一个返回类型的问题operator &(byte operand, byte operand2),编译器应该能够像任何其他运算符一样进行排序.

c# byte operators

22
推荐指数
3
解决办法
6998
查看次数

为什么有些类型没有文字修饰符

例如,为什么long int有一个文字修饰符,但是short int不是?我指的是这个网站上的以下问题:C#编译器编号文字

通常,C#似乎是一种设计良好且一致的语言.可能有一个强有力的理由为某些类型提供文字修饰符,但不是所有类型.它是什么?

c# literals

9
推荐指数
2
解决办法
5033
查看次数

为什么DateTime.Now.Year是一个int而不是一个ushort

在.Net框架DateTime结构中,Year被定义为int(实际上是System.Int32).但是,MSDN文档说该值始终介于1和9999之间.因此,ushort(System.UInt16)足以存储该值并占用一半的空间.那么为什么它是一个int而不是一个ushort呢?

有一个从ushort到int的隐式转换,因此在Year上不需要进行转换来进行整数运算.

我意识到这是一个微优化问题,因此不是很重要.我只是好奇.

.net types

7
推荐指数
1
解决办法
223
查看次数

短+短!=短?

版本: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次更新后我几乎无法相信)

c# short visual-studio-2013

6
推荐指数
1
解决办法
453
查看次数

为什么不选中不工作的字节?

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)

因此,应该抑制在未经检查的环境中编写的任何内容.

为什么它会给出编译时错误?

或者我根本不理解未经检查的关键字?

c#

3
推荐指数
1
解决办法
890
查看次数

结构布局优化

字节优化给你带来多大的性能提升(使它们成为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)

c# opengl optimization structure

2
推荐指数
1
解决办法
2221
查看次数

为什么没有铸造没有简单的算术工作?

我刚发现这个:

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)

这背后的原因是什么?难道不应该明显且易于使用所有数据类型吗?

c# casting

1
推荐指数
1
解决办法
122
查看次数