char 和 toupper 的结果不明确

Ambiguous result with char and toupper

'ab'存入char时如何转换为24930?

#include<stdio.h>

int main(){
    char c = 'ab';
    c = toupper(c);
    printf("%c", c);
    return 0;
}

GCC 编译器警告:从 'int' 到 'char' 的转换溢出将值从“24930”更改为“98”

Output : B

如果可能,请在此处解释 char 如何处理多个字符。

您的字符存储在右侧的 4 个字节中。 24930 = 0x6162 相当于 0x61 'a' 和 0x62 'b' = 'ab'

98 是你的 'b',六进制的 0x62,十进制的 98,检查 man ascii。由于溢出,以及您的系统在小端工作的事实,您的 2 个字符存储在 4 个字节上,如下所示:

0x62 0x61 0x00 0x00

因为只应将一个字符分配给 c(sizeof char 等于 1 个字节,最大限制为 256 位),它会截断并仅保留第一个字节,即您的 'b'。

您可以使用 char c = 'abcd' 轻松测试它,它将打印 'D'.

来自 C 标准(6.4.4.4 字符常量)

10 An integer character constant has type int. The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer. The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined.

所以这个字符常量'ab'被存储为int类型的对象。然后它被分配给类型为 char 的 ab 对象,就像在这个声明中一样

char c = 'ab';

那么int类型对象的最低有效字节用于初始化对象c。在您的情况下,字符 'b' 似乎存储在这个最低有效字节中并分配给对象 c.

符合要求的 char c 包含单个字符...多个字符需要 char *string 并且您需要遍历字符串,例如:

#include <stdio.h>
#include <cype.h>      // Needed for toupper()

int main()
{
    char *mystring = "ab[=10=]";  // Null terminate
    char *mychar   = mystring;

    while ( *mychar != '[=10=]' )
    {
      char c = toupper( *mychar );
      printf( "%c", c );
      mychar++;
    }
    return 0;
}

顺便说一句,toupper() returns 一个 int,所以这里有一个隐式类型转换。