【问题标题】:Specify a number literal as 8 bit?将数字文字指定为 8 位?
【发布时间】:2010-09-26 13:33:11
【问题描述】:

unsigned char ascii;
int a = 0;
char string[4] = "foo"; "A1"
ascii = (string[a] - 'A' + 10) * 16;

警告:转换为“无符号字符” from ‘int’ 可能会改变它的值

gcc 似乎默认将字符和数字文字视为 int。我知道我可以将表达式强制转换为 (unsigned char) 但如何将 char 文字和数字文字指定为 8 位而不进行强制转换?

类似的问题:

默认情况下,文字分数被视为双精度,但可以通过以下方式将它们指定为浮点数:

3.1f

因此,3.1 将被视为浮点数而不是双精度数。

【问题讨论】:

  • 警告不是因为你的文字的大小,而是因为这个特定表达式的结果不太可能适合unsigned char
  • @R: 并非如此,将“foo”修改为“A1”会使 ascii 160 在 0 - 255 范围内。我仍然收到同样的警告。

标签: c gcc


【解决方案1】:

C 中,您不能进行任何比int 更短的计算

char a = '8' - '0'; /* '8' is int */
char a = (char)'8' - '0'; /* (char)'8' is converted to `int` before the subtraction */
char a = (char)'8' - (char)'0'; /* both (char)'8' and (char)'0' are converted */

【讨论】:

    【解决方案2】:

    C 语言不提供任何指定类型为charunsigned char 的文字的方法。使用演员表。

    顺便说一句,您的计算结果超出了unsigned char 的范围,所以警告是完全正确的——转换会改变它的值。 C 不提供小于int 的任何类型的算术。在这种情况下,我想你想要的是模 256 算术,我认为 gcc 会认识到这一点,并且不会在强制转换到位时发出警告。但就 C 语言而言,计算是在较大的类型中完成的,然后转换为 unsigned char 以存储在 ascii 中。

    【讨论】:

    • 我的示例溢出,因为我使用了“foo”而不是现实生活中的示例。糟糕!
    • 我实际上对此有点头疼,并意识到使用 ASCII 它仍然有效 - fF 之间的差异是 32,所以一旦乘以 16,差异就消失了mod 256,你会得到正确的答案,0xF0。不过,我确实想知道您打算如何处理 o ;-)
    【解决方案3】:

    您可以指定 charint(C++ 中为char)类型的字符文字,并使用八进制或十六进制表示法指定特定数字。例如,\012 是八进制 12 或十进制 10。或者,您可以写成 '\x0a' 来表示相同的含义。

    但是,即使您这样做(并且计算没有溢出),它也可能无法消除警告,因为 C 语言指定所有操作数至少提升为 int(或 unsigned int , 取决于操作数类型) 在计算完成之前。

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多