C语言中char类型的数据'abc'、'\abc'、'\a\bc'三个的值为什么会这样?
本帖最后由 你不会了解 于 2021-11-5 14:58 编辑#include <stdio.h>
int main(void)
{
char ch1 = 'abc';
char ch2 = '\abc';
char ch3 = '\a\bc';
printf("%c %d\n", ch1, ch1); // c 99
printf("%c %d\n", ch2, ch2); // c 99
printf("%c %d\n", ch3, ch3); // 7}
上述三个变量,ch1和ch2分别保存的是c的二进制值
我理解的是,这两变量按小端模式存储,实际要反着来
如'cba','cb\a',又因char只能存一个字节,所以保存的是c
但是为什么ch3保存的是\a的值,也就是7,为什么? 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 。 字节串,。。 \a的含义是警报,对应的ASCII码值是007 至于大端和小端和CPU有关 只能保存一个字节 对应的是ASCII码 https://en.cppreference.com/w/cpp/language/character_literal
针对你的问题:
1,多字符的char字面量('abc'),储存类型是`int`,值是实现定义的
2,假设'abc'实现定义是小端序4字节int,则 int 保存的值是`0x00616263`(内存中是`63626100`),根据c的舍入规则,取低位1字节,是'c',也就是0x63.
针对你的案例代码,我特地还用 gcc 和 clang 试了一下:
#include <stdio.h>
int main(void) {
printf("%08x %02x", '\a\bc', (char)'\a\bc');
return 0;
}
结果是 00070863 63
你说输出 \a 的话我建议你再检查下你的案例代码是怎么写的, ```cpp
char ch1 = 'abc';
int ch = 'abc';//6382179
//01100001 01100010 01100011,
//97 98 99
//ASCII码:a b c
char ch2 = '\abc';
int ch5 = '\abc';//483939
//0111 01100010 01100011
//7 98 99
//ASCII码:\a b c
char ch3 = '\a\bc';
int ch6 = '\a\bc';//6490119
//01100011 00001000 00000111,
//99 8 7
//ASCII码:c \b \a
``` wuai习 发表于 2021-11-5 14:37
```cpp
char ch1 = 'abc';
int ch = 'abc';//6382179
编译器提醒:“初始化”: 从“int”到“char”截断
重新定义int变量看了一下它的值,转化为二进制,实际就是这样存储的 weakptr 发表于 2021-11-5 14:08
https://en.cppreference.com/w/cpp/language/character_literal
针对你的问题:
char ch1 = 'abc';
char ch2 = '\abc';
char ch3 = '\a\bc';
printf("%c %d\n", ch1, ch1);
printf("%c %d\n", ch2, ch2);
printf("%c %d\n", ch3, ch3);
就这么几行代码,写在main函数里,引入stdio头文件,其他没有
Win10,VS2019,Debug x64调试
最终输出结果(\a是警告提示,调试时听到声音了)
c 99
c 99
7 gcc的结果是
c 99
c 99
c 99
改一下你的代码
#include <stdio.h>
int main()
{
int i1 = 'abc';
int i2 = '\abc';
int i3 = '\a\bc';
printf("%c %x\n", i1, i1);
printf("%c %x\n", i2, i2);
printf("%c %x\n", i3, i3);
}
结果就是
c 616263
c 76263
c 70863
我觉得很明显了
估计msvc的操作不一样吧
页:
[1]
2