【问题标题】:Reading a signed char as unsigned - Type Promotion将已签名的字符读取为未签名 - 类型提升
【发布时间】:2011-12-06 07:28:53
【问题描述】:

考虑这个小程序:

#include <stdio.h>
int main()
{
    char c = 0xFF;
    printf("%d\n", c);

    return 0;
}

它的输出是-1,正如预期的那样(考虑到char在我的 系统)。我想做的是让它打印255。这是 当然是对真实情况的简化,我不能只定义 c 未签名。

第一个可能的更改是使用%u 作为格式化程序,但是 通常的类型提升规则在这里适用,并且数字打印为 232 - 1.

那么有什么方法可以在 之前将已签名的字符读取为未签名的字符 提升为int?我可以创建一个指向无符号字符集的指针 c 的地址,稍后取消引用,但不确定这是否是最好的 接近。

【问题讨论】:

    标签: c char int type-conversion integer-promotion


    【解决方案1】:

    c 正在使用已签名的升级规则进行升级。将c 转换为未签名以使用未签名的促销。

    printf("%u\n", (unsigned char)c);
    

    Unsigned char 将被提升为 unsigned int。

    【讨论】:

    • 如果你愿意,我很确定你可以使用 %d 而不是 %u。
    • 在这种情况下是可以的,因为该值必须是 [0 - 256)。一般来说,说明符应该与变量类型相匹配。我认为如果打开某些警告,GCC 会抱怨。
    • 实际上我尝试转换为(unsigned int)c,但这不起作用(现在我想知道为什么)。我没有尝试过(unsigned char)c
    • 啊,我猜编译器符号在从signed char -> unsigned int 转换时会扩展。这种方式 signed char -> unsigned int -> signed int 返回与您开始时相同的值。
    • 我可能应该使用hhh 在 C99 中定义吗?)来表示它的宽度。但是,由于标准保证了使用 varargs 进行类型提升,我实际上看不到 h 的目的。 (l 是必要的!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多