带有char和toupper的不明确结果

带有char和toupper的不明确结果,c,char,implicit-conversion,literals,toupper,C,Char,Implicit Conversion,Literals,Toupper,当存储在char中时,“ab”是如何转换为24930的 #include<stdio.h> int main(){ char c = 'ab'; c = toupper(c); printf("%c", c); return 0; } #包括 int main(){ 字符c='ab'; c=toupper(c); printf(“%c”,c); 返回0; } GCC编译器警告:从“int”到“char”的转换过程中出现溢出,将

当存储在char中时,“ab”是如何转换为24930的

#include<stdio.h>

int main(){
    char c = 'ab';
    c = toupper(c);
    printf("%c", c);
    return 0;
}
#包括
int main(){
字符c='ab';
c=toupper(c);
printf(“%c”,c);
返回0;
}
GCC编译器警告:从“int”到“char”的转换过程中出现溢出,将值从“24930”更改为“98”

产出:B


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

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

98是您的“b”,0x62是十六进制,98是十进制,请使用
man ascii检查。由于溢出,以及您的系统在little endian中工作的事实,您的2个字符存储在4个字节上,如下所示:

0x62 0x61 0x00 0x00
因为只有一个字符应该分配给c(sizeof char等于1字节,最大限制为256位),所以它只截断并保留第一个字节,即“b”

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

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

10整型字符常量的类型为int。整型字符常量的值 整数字符常量,包含映射到的单个字符 单字节执行字符是 被解释为整数的映射字符的表示形式。 包含多个字符(如“ab”)或包含字符或转义序列的整数字符常量的值 不映射到单字节执行字符的 已定义实现。

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

char c = 'ab';

然后使用
int
类型的对象的最低有效字节初始化对象
c
。在您的例子中,字符
'b'
似乎存储在这个最低有效字节中,并被分配给对象
c

一个一致的
字符c
包含一个字符。。。多个字符需要
char*string
,您需要遍历字符串,例如:

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

int main()
{
    char *mystring = "ab\0";  // Null terminate
    char *mychar   = mystring;

    while ( *mychar != '\0' )
    {
      char c = toupper( *mychar );
      printf( "%c", c );
      mychar++;
    }
    return 0;
}
#包括
#包括//toupper()所需的
int main()
{
char*mystring=“ab\0”//Null终止
char*mychar=mystring;
而(*mychar!='\0')
{
字符c=toupper(*mychar);
printf(“%c”,c);
mychar++;
}
返回0;
}

另一方面,
toupper()
返回一个
int
,因此这里有一个隐式类型转换。

这里有什么不明确的地方?请解释它是如何工作的?检查编译器手册-这是实现定义的,每个编译器都会做出选择并记录它所做的事情谢谢@M.MThanks你。你能分享一些资源来学习更多关于基本原则的知识,以及如何像你一样获得理解吗?欢迎你来Naman!阅读书籍、教程、博客、前200名答案和github。如果你有时间的话,我做了一个小指南,但要注意它还没有校对过,我仍然不知道这里有多少…谢谢。刚刚在LinkedIn上向您发送了连接请求:)。