【问题标题】:unsigned char to int in C++在 C++ 中将无符号字符转换为 int
【发布时间】:2012-05-20 18:36:22
【问题描述】:

我有一个变量 unsigned char 包含一个值,例如 40。 我想要一个 int 变量来获取该值。 最简单和最有效的方法是什么? 非常感谢。

【问题讨论】:

  • unsigned char 本质上是一个字节的内存,被计算机解释为一个从 0 到 255 的整数。整数类型通常是 4 个字节,范围为 -2147483648 到 2147483647。转换通常涉及从一个价值到另一个。 unsigned char 到整数赋值没有问题,但反过来会在高端出现溢出问题。将负数转换为无符号字符并不意味着完整。

标签: c++ casting unsigned


【解决方案1】:
unsigned char c = 40;
int i = c;

想必你的问题还不止这些……

【讨论】:

  • 如果我写 printf("c: %x", c) 我得到 32。然后我写 int i=c 当我打印 "i" 时我得到 50!
  • @user1346664: %x 以十六进制打印。十六进制 32 等于十进制 50。请改用%d
【解决方案2】:

尝试以下方法之一,它对我有用。如果需要更具体的演员表,可以查看 Boost 的 lexical_castreinterpret_cast

unsigned char c = 40;
int i = static_cast<int>(c);
std::cout << i << std::endl;

或:

unsigned char c = 40;
int i = (int)(c);
std::cout << i << std::endl;

【讨论】:

  • 首选 C++ 构造函数风格 int(c) 而不是 C-cast 风格:(int)(c)
【解决方案3】:

Google 通常是一个有用的工具,但答案非常简单:

unsigned char a = 'A'
int b = a

【讨论】:

    【解决方案4】:

    实际上,这是一个隐式转换。这意味着您的值会自动转换,因为它不会溢出或下溢。

    这是一个例子:

    unsigned char a = 'A';
    doSomething(a); // Implicit cast
    
    double b = 3.14;
    doSomething((int)b); // Explicit cast neccesary!
    
    void doSomething(int x)
    {
    ...
    }
    

    【讨论】:

    • 为什么需要对 double->int 进行显式强制转换?它不会只是隐式截断吗?
    • 是的,但您会收到编译器警告,因此建议您这样做。
    • 奇怪,我在 GCC 的最高级别没有收到任何警告。
    【解决方案5】:

    取决于你想做什么:

    要将值作为ASCII码读取,可以编写

    char a = 'a';
    int ia = (int)a; 
    /* note that the int cast is not necessary -- int ia = a would suffice */
    

    要转换字符'0' -> 0,'1' -> 1等,可以写

    char a = '4';
    int ia = a - '0';
    /* check here if ia is bounded by 0 and 9 */
    

    【讨论】:

      【解决方案6】:
      char *a="40";
      int i= a;
      

      'a' 中的值将是 ASCII 值 40(不会是 40)。

      尝试使用 stdlib.h 中定义的 strtol() 函数

      请小心,因为此函数用于字符串。对角色无效

      【讨论】:

      • a(和i)的值为 40,因为这是您刚刚分配的值。
      • 如果忽略编译器警告,您会发现i 获取了存储字符串“40”的地址,这当然是“a”在其中的内容。啊 - 回到那个懦弱的 ANSI 标准之前的美好时光 - 当 C 是弱类型时,程序员有更强的头脑,可口可乐是用真正的糖制成的!呸!孩子们这些天..!呸!!
      • 问题是关于无符号字符的。为什么要使用 char*?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多