【问题标题】:Is unsigned char always promoted to int?unsigned char 是否总是提升为 int?
【发布时间】:2013-07-26 18:44:30
【问题描述】:

假设如下:

unsigned char foo = 3;
unsigned char bar = 5;

unsigned int shmoo = foo + bar;

是否保证foobar 值被提升为int 值以评估表达式foo + bar - 或者是否允许实现将它们提升为unsigned int

第 6.2.5 节第 8 段:

对于任意两个具有相同符号和不同整数转换等级的整数类型 (见 6.3.1.1),整数转换等级较小的类型的取值范围是 其他类型值的子范围。

第 6.2.5 节第 9 段:

如果一个int可以表示原始类型的所有值,则将该值转换为一个int;否则,将其转换为 unsigned int

保证具有较小整数转换等级的整数类型的值范围是其他类型值的子范围,这似乎取决于整数类型的有符号性

  • signed char 对应于signed int
  • unsigned char 对应于unsigned int

这是否意味着unsigned char 的值只能保证在unsigned int 的子范围内,而不一定是int?如果是这样,这是否意味着一个实现理论上可能具有一个不在int 子范围内的unsigned char 值?

【问题讨论】:

  • 除非你找到一个 int 为 8 位的系统,否则它应该像第 6.2.5 节第 9 段指出的那样工作。
  • @GrijeshChauhan 我认为该网站假设整数类型的最小幅度。我相信实现只需要支持这些最小幅度,但允许将范围幅度定义为更大(第 5.2.4.2.1 节:Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.)。
  • @VilhelmGray 我刚刚问是因为您似乎在发布相关问题,.. 好吧@Ouah 正在帮助您,祝您好运!
  • @hetepeperfan 在标准 C 编译器中,int 必须至少为 16 位,但没有什么能阻止 unsigned charint 一样宽(例如都是 24 位)哪种情况unsigned char 会提升为unsigned int

标签: c type-conversion c99 integer-promotion type-promotion


【解决方案1】:

是否允许实现将它们提升为 unsigned int?

如果不是所有unsigned char 值都可以在int 中表示(由C99 中的6.2.5p9 规定),则实现将升级为unsigned int。请参阅下面的实现示例。

如果是这样,这是否意味着一个实现理论上可以有一个 unsigned char 值,它不在 int 的子范围内?

是的,例如:CHAR_BIT 16 或 32 的 DSP cpu。

例如,用于 TMS320C55x 的 TI C 编译器:CHAR_BIT 为 16,UCHAR_MAX 65535,UINT_MAX 65535 但INT_MAX 32767。

http://focus.ti.com/lit/ug/spru281f/spru281f.pdf

【讨论】:

  • 我相信这种可能性是char 必须可以被签名的原因(因为char 的所有值都必须适合int)。相反,要求 C 字符集的所有成员强制某些编译器将 char 设为无符号(例如,在 EBCDIC 中,我认为数字 0-9 是 0xF0-0xF9)。
  • 如果我有这样的东西 int x = 1234char *y = &x1234 的二进制表示是 00000000 00000000 00000100 11010010 。我的机器是小端的,所以它将它反转并存储在内存中11010010 00000100 00000000 00000000 LSB 是第一位的。现在主要部分。如果我使用printf("%d" , *p)printf 将读取第一个字节 11010010only 输出是 -4611010010210 那么为什么它打印 -46 。我真的很困惑,我猜一些字符到整数的提升正在做一些事情,但我不知道。
  • @SurajJain 我想你的意思是printf("%d" , *y)d 说明符写入有符号值,11010010 在二进制补码表示中是 -46。使用printf("%d" , (unsigned char) *y) 写入无符号值。如果您还有其他问题,我可以建议您打开 stackoverflow 问题吗?
  • 先生,我打开了一个问题,当我创建答案时,我写了它,几个月以来我希望它得到检查,你能帮我做吗,我只是想确认我写的是正确,不会将任何人引向错误的方向。 stackoverflow.com/questions/34826036/…
  • @SurajJain 评论已添加。
【解决方案2】:

我昨天遇到了这个问题 - 希望我的回答是主题。

uint8_t x =  10;
uint8_t y = 250;

if (x - y > 0) {
    // never happens
}

if (x - y < 0U) {
    // always happens
}

在我看来,至少 x 和 y 值似乎被意外提升了,而实际上是它们的结果被提升了。

【讨论】:

  • 我不明白你在说什么。 x 和 y 都应该被提升为 int 所以你应该有 -240 然后被提升为无符号的比较 (4294967056
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2017-01-13
  • 2013-08-08
相关资源
最近更新 更多