带有char和toupper的不明确结果
当存储在char中时,“ab”是如何转换为24930的带有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”的转换过程中出现溢出,将
#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上向您发送了连接请求:)。