C中的简单字符解释

这是我的代码

 #include<stdio.h>

 void main()
 {
     char ch = 129;
     printf("%d", ch);
 }

我得到输出为-127.这是什么意思?

最佳答案
这意味着char是一个8位变量,只能容纳2 ^ 8 = 256个值,因为声明是char ch,ch是有符号变量,这意味着它可以存储127个负值和正值.当你要求超过127时,该值从-128开始.

可以把它想象成一些街机游戏,你从屏幕的一边走到另一边:

ch = 50;

                                    ----->                        50 is stored
      |___________________________________|___________|           since it fits
    -128                       0         50          127          between -127
                                                                  and 128

ch = 129;

                                                    ---           129 goes over
      -->                                                         127 by 2, so
      |__|____________________________________________|           it 'lands' in
    -128  -127                 0                     127          -127

但!!你不应该依赖它,因为它是未定义的行为!

为了纪念Luchian Grigore,这里有一些代表:

char是一个容纳8位或一个字节的变量.因此,我们有8 0和1的努力代表你想要的任何价值.如果char是带符号的变量,它将表示它是正数还是负数.你可能读到了代表符号的一位,这是真实过程的抽象;事实上,它只是电子产品中首批实施的解决方案之一.但是这样一个简单的方法有一个问题,你将有2种方式来表示0(0和-0):

0 0000000     ->    +0        1 0000000     ->    -0                    
^                             ^ 
|_ sign bit 0: positive       |_ sign bit 1: negative

保证不一致!!因此,一些非常聪明的人提出了一个名为Ones’Complement的系统,它代表一个负数,作为其正面对应的否定(NOT操作):

01010101      ->    +85
10101010      ->    -85

这个系统……有同样的问题. 0可以表示为00000000(0)和11111111(-0).然后是一些聪明的人创造了Two’s Complement,它将保留前面方法的否定部分,然后加1,因此删除那个讨厌的-0并给我们一个闪亮的新数字到我们的范围:-128!.那么我们的产品系列现在如何?

00000000     +0
00000001     +1
00000010     +2
...
01111110     +126
01111111     +127
10000000     -128
10000001     -127
10000010     -126
...
11111110     -2
11111111     -1

因此,当我们的小处理器尝试向变量添加数字时,这应该可以了解发生了什么:

 0110010     50                   01111111     127
+0000010    + 2                  +00000010    +  2
 -------     --                   --------     ---
 0110100     52                   10000001    -127
     ^                                  ^       ^
     |_ 1 + 1 = 10          129 in bin _|       |_ wait, what?!

是的,如果您查看上面的范围表,您可以看到最多127(01111111)二进制文件很好而花花公子,没有什么奇怪的事情发生,但是在第8位设置为-128(10000000)后,数字不再被解释保持其二进制幅度,但两个补语表示.这意味着,二进制表示,变量中的位,1和0,我们心爱的字母的核心,确实持有129 …它在那里,看看它!但是,邪恶的处理器读取它,因为可靠的-127导致变量HAD被签名,从而破坏了它在1维欧几里德空间中通过实数线的臭味转移的所有正电位.

转载注明原文:C中的简单字符解释 - 代码日志