【问题标题】:How to convert int to byte in c?如何在c中将int转换为字节?
【发布时间】:2021-02-02 08:28:15
【问题描述】:

我想在 C 中将 int 转换为 byte。 我怎样才能获得价值?

in Java

int num = 167;
byte b = num.toByte(); // -89 
in C

int num = 167;
???

【问题讨论】:

  • int8_t b = (int8_t) num;?

标签: c type-conversion


【解决方案1】:

原生 C 中没有 Byte 这样的类型。虽然如果你不想导入新的库,你可以像这样创建一个:

typedef unsigned char Byte

然后用它创建任何你想要的变量:

int bar = 15;
Byte foo = (Byte)bar

【讨论】:

    【解决方案2】:

    您可以简单地转换为一个字节:

    unsigned char b=(unsigned char)num;
    

    请注意,如果num 大于 255 或小于 0 C 不会崩溃,只会给出错误的结果。

    【讨论】:

    • 编辑后,结果明确。 “否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值重复加或减1来转换值。”直到值在新类型的范围内。
    【解决方案3】:

    在计算机科学中,术语 byte 被明确定义为 8 位的原始数据块。显然,Java 使用了与计算机科学不同的定义......

    • -89 不是值167“转换为字节”。 167 已经适合一个字节,因此无需转换。

    • -89 是值167 转换为 有符号 2 的补码,具有 8 位表示。

    • 在 C 中用于有符号 2 的补码 8 位整数的最正确类型是 int8_t,来自 stdint.h。

    • 从int 到int8_t 的转换是在C 中在赋值时隐式完成的。不需要演员表。

      int num = 167;
      int8_t b = num;
      

    【讨论】:

      【解决方案4】:

      byte 是一个 java 有符号整数类型,范围为 -128 到 127。 C 中对应的类型是int8_t,在<stdint.h> 中定义,用于8 位字节的体系结构。它是signed char 的别名。

      你可以写:

      #include <stdint.h>
      
      void f() {
          int num = 167;
          int8_t b = num;  // or signed char b = num;
          ...
      

      如果您的编译器发出关于隐式转换为较小类型的警告,您可以添加显式转换:

          int8_t b = (int8_t)num;  // or signed char b = (signed char)num;
      

      但请注意,将 8 位字节视为0 到255 范围内的无符号量更为常见,对此可以使用uint8_t 或unsigned char 类型。 java byte 是有符号类型的原因可能是该语言中没有无符号类型,但对于非母语读者来说相当混乱。

      byte也可以定义为typedef:

      typedef unsigned char byte;  // 0-255;
      

      或

      typedef signed char byte;    // -128-127;
      

      不要使用类型char,因为默认情况下该类型是有符号还是无符号是实现定义的。为 C 字符串中的字符保留类型 char,尽管许多函数实际上认为这些是无符号的:strcmp(),来自 &lt;ctype.h&gt; 的函数...

      【讨论】:

      • "但是请注意,C 程序员通常更喜欢将 8 位字节视为无符号量" 不仅仅是 C 程序员。所有的计算机科学家和计算机工程师也是如此。显然 Java byte 是由一些特殊的雪花设计的。
      • @Lundin:java 没有无符号类型,我可能应该改写这部分。
      猜你喜欢
      • 2011-02-10
      • 2011-02-12
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2013-11-23
      • 2016-03-04
      相关资源
      最近更新 更多