当前位置: 首页 > 知识库问答 >
问题:

将char类型(非ascii)转换为int

计向晨
2023-03-14

我想将char类型转换为int类型,而不丢失有符号的含义,所以我在文件int_test中编写代码。c和它的工作原理:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

#define c2int(x) \
({                         \
        int t;             \
        if (x > 0x80)      \
                t = x | (1 << sizeof(int) * 8) - (1 << sizeof(char) * 8); \
        else               \
                t = x;     \
        t;                 \
 })

int main()
{
        uint8_t a = 0xFE;
        int b;

        b = c2int(a);

        printf("(signed char)a = %hhi, b = %d\n", a, b);

        exit(EXIT_SUCCESS);
}

运行结果是:

(有符号字符)a=-2,b=-2

编译日志是:

gcc-o int _ test int _ test . c int _ test . c:在函数“main”中:int_test.c:9:15:警告:左移位计数

我的问题是:1.是否有简单有效的转换?2.简单地将char转换为int时,如何确定有符号扩展?3.如何避免上述警告?

谢谢你。

共有3个答案

司马飞
2023-03-14

>

  • 有没有简单高效的转换?

    // To convert a value to char and then to int
    // As a function or macro
    #define c2int(x) ((int)(char)(x))
    int c2int(char x) { return x; }
    
    // To convert a value to signed char and then to int
    #define c2int(x) ((int)(signed char)(x))
    int c2int(signed char x) { return x; }
    

    简单地把char转换成int时,如何确定有符号展开?

    不需要特殊代码,见上文。c为你做这个。

    如何避免上述警告?

    确保移位小于位宽。< br >避免移入符号位。

  • 杜俊远
    2023-03-14

    是否要扩展签名?如果你想要签名扩展,你必须先通过一个签名的字符。如果不是,则只需使用赋值或初始化的隐式转换:

    unsigned char x = 0xfe;
    int y = (signed char) x;
    int z = x;
    printf("x = %hhx, y = %08x, z = %08x\n", x, y, z);
    

    上面的代码应该打印

    x = fe, y = fffffffe, z = 000000fe
    
    韦星文
    2023-03-14

    您正在进行手动、显式的符号转换。不要这样做。相反:

    static int c2int(unsigned char x)
    {
        return (signed char)x;
    }
    

    这确实为您签署了扩展,并且不会产生警告。

     类似资料:
    • 问题内容: 我引用了Herbert Schildt的第3章:数据类型,变量和数组: 字符的范围是0到65535。没有负字符。标准字符集ASCII(通常称为ASCII)的范围始终为0到127,而扩展的8位字符集ISO- Latin-1的范围为0到255。由于Java旨在允许程序在全球范围内编写使用时,将使用Unicode表示字符是有意义的。只要整数在范围内,也可以将整数分配给char。 (which

    • 当运行此代码时,我得到以下错误:

    • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

    • 问题内容: 我正在获取ASCII值,并且想将其转换为整数,因为我知道它是整数ASCII值。 这是5的ASCII值。我如何将其转换为整数? 问题答案:

    • 我是新到Java,我需要一个程序,接受4个整数输入,4个双输入,和3个字符输入。我准备好了整数和双倍输入。我真的需要帮助得到字符输入,请帮助。 我一直得到这个错误: 不兼容类型:char无法转换为char[]charValue=input.charat(0); 这是我的代码:

    • 问题内容: 将a转换为a 的最直接和/或最有效的方法是什么? 问题答案: 没有副本: 但是,该方法可能更容易编写,更容易阅读和更快。