在C#中是否可以在没有类型转换的情况下将整数转换为无符号整数? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中是否可以在没有类型转换的情况下将整数转换为无符号整数? [关闭]相关的知识,希望对你有一定的参考价值。

是否可以将整数转换为无符号整数而无需显式类型转换?

我有以下代码 -

using System;

class MainClass
{
    public static void Main ()
    {
        int num1 = -33;
        uint num2 = Convert.ToUInt32 (num1);
        Console.WriteLine (num2);
    }
}

它抛出了我的错误 -

抛出了System.OverflowException。

对于UInt32,值太大或太小

我不想使用显式类型转换。这样可能吗?

问题不是How can I convert a signed integer into an unsigned integer?问题的重复我正在特别提到我想知道是否可以不使用明确的类型转换?

答案

我想知道是否有可能没有明确的类型转换?

简短的回答是:不。

我想知道Convert.ToUInt32()函数存在的原因

答:微软的某个人发现它很有用并创造了它。其他人发现它有用/易于使用和使用它。我想我们找不到实现该功能的具体原因。

有关此主题的更多信息:

This answer陈述了4种可能性。每个都包括一个类型转换。我不知道将uint转换为int的另一个内置功能。 That answer很好地解释了uint-> int的转换及其陷阱。

(UltraShort)总结:你必须要处理溢出问题。

在处理无符号类型时,您应该查看checkedunchecked关键字。

TypeConversion

根据this,有4种TypeConversion方法。

  • 含蓄
  • 明确的
  • 使用conversion oerators进行用户定义的转换。
  • 与helüer类的转换(如Convert类)

Convert.ToInt32()/ Convert.ToUInt32()的用例

ToInt32()的代码示例取自msdn

float[] values= { Single.MinValue, -1.38e10f, -1023.299f, -12.98f,
                  0f, 9.113e-16f, 103.919f, 17834.191f, Single.MaxValue };
int result;

foreach (float value in values)
{
   try {
      result = Convert.ToInt32(value);
      Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
                        value.GetType().Name, value, result.GetType().Name, result);
   }
   catch (OverflowException) {
      Console.WriteLine("{0} is outside the range of the Int32 type.", value);
   }   
}                                 
// The example displays the following output:
//    -3.40282346638529E+38 is outside the range of the Int32 type.
//    -13799999488 is outside the range of the Int32 type.
//    Converted the Double value -1023.29901123047 to the Int32 value -1023.
//    Converted the Double value -12.9799995422363 to the Int32 value -13.
//    Converted the Double value 0 to the Int32 value 0.
//    Converted the Double value 9.11299983940444E-16 to the Int32 value 0.
//    Converted the Double value 103.918998718262 to the Int32 value 104.
//    Converted the Double value 17834.19140625 to the Int32 value 17834.
//    3.40282346638529E+38 is outside the range of the Int32 type.

Convert.ToUInt(Int32)的代码示例也取自msdn

int[] numbers = { Int32.MinValue, -1203, 0, 121, 1340, Int32.MaxValue };
uint result;
foreach (int number in numbers)
{
   try {
      result = Convert.ToUInt32(number);
      Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
                        number.GetType().Name, number,
                        result.GetType().Name, result);
   }
   catch (OverflowException) {
      Console.WriteLine("The {0} value {1} is outside the range of the UInt32 type.",
                        number.GetType().Name, number);
   }
}
// The example displays the following output:
//    The Int32 value -2147483648 is outside the range of the UInt32 type.
//    The Int32 value -1203 is outside the range of the UInt32 type.
//    Converted the Int32 value 0 to the UInt32 value 0.
//    Converted the Int32 value 121 to the UInt32 value 121.
//    Converted the Int32 value 1340 to the UInt32 value 1340.
//    Converted the Int32 value 2147483647 to the UInt32 value 2147483647.
另一答案

根据OP评论的要求:

//Sample inputs
string str = "15";
bool b = false;
int i = 15;
double d = 14.5;
object o = str;
object oi = i;

//These are not valid
//uint ustr = (uint)str; 
//uint ub = (uint)b;

//This is valid at compile time but throw a run time exception
//uint uo = (uint)o;
//uint uoi = (uint)oi;

//These are valid
uint ustr = Convert.ToUInt32(str);
uint ub = Convert.ToUInt32(b);
uint uo = Convert.ToUInt32(o);
uint uoi2 = Convert.ToUInt32(oi);

//both ways are valid
uint ud = (uint)d;
uint ud2 = Convert.ToUInt32(d);
uint ui = (uint)i;
uint ui2 = Convert.ToUInt32(i);

//Some inputs can't be converted by either way (casting may be possible but result in wrong values)
string str2 = "Bananas";
int i2 = -15;

以上是关于在C#中是否可以在没有类型转换的情况下将整数转换为无符号整数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不转换为整数的情况下将 null 转换为 int?

如何在不丢失信息的情况下将因子转换为整数\数字?

有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 转换为基指针?

在不访问库的情况下将整数转换为字符串

Postgresql 在没有时区的情况下将秒转换为时间

有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64