【问题标题】:Any differences between 0xff and 255, for a "int" variable?对于“int”变量,0xff 和 255 之间有什么区别吗?
【发布时间】:2018-03-09 16:08:33
【问题描述】:

这样编码有什么区别吗:

int something = 255;

或者这个:

int something = 0xff;

另外:如果这个变量稍后被转换为byte,它仍然是一样的吗?

【问题讨论】:

  • 为什么会有差异?它们都是相同值的整数,只是使用不同的表示进行初始化。因此它们将转换为相同的字节值。通过声明两者并比较相等性,您可以很容易地看到这一点。
  • 数字文字 2550xff 之间的唯一区别是它们是同一数字的两种不同表示形式。但情况并非总是如此。例如,数字文字 0xffffffff 仍然是 32 位值,因此可以放入 int 中。但是,十六进制值被视为无符号值,因此 ``0xffffffff' 不能在不强制转换的情况下分配给 int。有趣的是,如果你使用var v1 = 0xff; var v2 = 0xffffffff;,你会注意到 v1 是 int 类型,而 v2 是 uint 类型;所以整个十六进制表示法有点上下文相关(1/2)
  • (2/2) 具有隐含的数据类型(即,使用var 赋值),具体取决于十六进制值是否适合给定(最小)类型。但是,十六进制数字文字的最小隐含类型是 32 位类型,例如 int/uint。不确定这是 C# 规范的规则还是只是 Visual Studio 的 C# 编译器的选择...
  • 更新我上一条评论:根据 C# 规范,整数文字(包括十六进制表示法)只能是 int、uint、long 和 ulong 类型。
  • @BrootsWaymb :我没有看到任何差异。我问是因为我担心我可能错过了什么。在我们的代码库中,有人在这两种格式之间切换很有趣,显然没有充分的理由。 ://

标签: c# byte


【解决方案1】:

我问的内容没有区别,但有一些模糊的推理:由于变量稍后被转换为byte,因此它是 int 的最大值。

    var v1 = 0xff; //255
    var v2 = 0x100; //256

    Console.WriteLine((byte)v1);
    Console.WriteLine(v1 == (int)v1);
    Console.WriteLine(v1 == (uint)v1);
    Console.WriteLine(v1 == (byte)v1);      

    Console.WriteLine((byte)v2);
    Console.WriteLine(v2 == (int)v2);
    Console.WriteLine(v2 == (uint)v2);
    Console.WriteLine(v2 == (byte)v2);

输出:

255
True
True
True
0      <--
True
True
False  <--

【讨论】:

  • 确实,晦涩的推理,文档中解释了这种行为。
  • 我在尝试一些想到的东西时偶然发现了这个线程。在 C# 中,我尝试使用 255,255,0 更改灯光的颜色以使其变为黄色,但灯光始终为红色。直到尝试 0xFF,0xFF,0 它才更改为正确的颜色,所以我不确定为什么差异在那里起作用,但可能是因为类型是 uint。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2017-10-17
  • 2015-01-06
  • 2018-02-25
  • 2015-11-07
  • 2014-06-12
相关资源
最近更新 更多