char c = 123456;
cout << c << endl;
warning: implicit conversion from 'int' to 'char' changes value from 123456 to 64 [-Wconstant-conversion]
char c = 123456;
~ ^~~~~~
1 warning generated.
我得到这个输出。
char在c++中是1字节,范围是-128到127(有符号)和0到255(无符号),所以123456不能存储在其中,我明白,但是编译器如何将123456转换为char 64,其中ascii值“ @”.
我预计它会给我一个错误或转换它,但这个转换我无法理解。
如果将十进制
123456
转换为十六进制,则会得到 1E240
。
A
char
,只有 1 个字节(当前所有感兴趣的机器都是 8 位),可以存储 2 个十六进制数字(1 个十六进制数字是 4 位,所以 8 位需要 2 个数字)。
因此,将太大的
1E240
分配给单个 char
将会在该 40
字节中留下十六进制 char
。计算机软件中的溢出(通常)会丢弃左边的数字,只保留右边合适的数字。
在
ASCII 表中查找十六进制
40
(或转换为十进制 64
然后查找)显示这是 @
字符。
再说一次,为什么是 ASCII?这是所有“相关”编码的基础,所以我什至不问你的盒子正在使用什么,因为它必然是 ASCII 的某种派生......