【问题标题】:Converting an int to char using printf使用 printf 将 int 转换为 char
【发布时间】:2012-11-15 17:55:11
【问题描述】:

我只是想知道以下是否是将 int 转换为 char 的正确方法

#include <stdio.h>

int main()
{
   int x = 500;
   printf("%hhd\n", x);
}

另外,从上面我想知道我是否应该执行以下操作来显示字符的值。

#include <stdio.h>

int main()
{
   char c = 'a';
   printf("%hhd\n", c);
}

或者只是printf("%d\n", c); 可以吗?所以,基本上我试图通过 printf 输出整数的第一个字节而不进行任何转换。

【问题讨论】:

    标签: c printf c99


    【解决方案1】:

    在您的第一个示例中使用%hhd 强制符合C99 的printf()int 转换为char,然后再打印它。根据您的字符是有符号还是无符号,您可能会看到 244 或 -12 作为打印的值。这是否是“正确”的打印方式值得商榷。很可能不是。打印字符的正常方法是使用%c。一个问题是500 应该代表什么字符?对于charsigned charunsigned char 类型,它的值超出范围(几乎在所有平台上)。如果它是 Unicode 字符或其他宽字符值,那么您可能需要使用宽字符格式变体 — wprintf()

    您使用%c 格式和普通char'a' 的第二个示例表现良好且传统。这将打印字母“a”。如果您使用%hhd,它也可以工作并且通常会打印 97(您必须在不寻常的计算机上才能获得不同的值)。

    【讨论】:

    • @Johathan:我不想使用%c 打印字符,而是打印整数的第一个字节的值。
    • @user963241 x &amp; 0xFF?还是位掩码也被禁止?
    • @DanielFischer:是的,这是一种方法。我想知道我是否可以使用printf 来处理转换。
    • 哪个是“整数的第一个字节”?它是 MSB(最高有效字节)、LSB(最低有效字节)还是取决于硬件的字节顺序(整数中最低地址的字节)? %hhd 格式将打印 LSB(不考虑字节序)。
    【解决方案2】:
    #include <stdio.h>
    
    int main()
    {
       int x = 500;
       printf("%hhu\n", x);
    }
    

    这将打印244

    500 = 00000001 11110100

    244 = 11110100

    【讨论】:

    • 虽然这可行,但通常最好明确代码的意图是什么。我通常被鼓励使用显式转换而不是让 printf() 自动处理格式转换。
    • 我应该补充一下,像 PC-Lint 这样的工具会因此而产生错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多