转会但姿势丶 发表于 2020-2-17 12:06:17

设一个字符型变量i,赋值为255然后在printf中用%d打印出来,结果为啥是-1?

《带你学C带你飞》S1E7   取值范围
编译器是Dev-C++
设一个字符型变量i(char i),赋值255(i = 255),然后在printf中用%d打印出来,为啥结果是-1
代码如下,求解答

static/image/hrline/line7.png

#include <stdio.h>

int main()
{
        char i;
        int j;
       
        i = 255;
        j = 255;
       
        printf("i的值是:%d\n", i);
        printf("j的值是:%d\n", j);
       
        return 0;
}

转会但姿势丶 发表于 2020-2-17 15:56:15

本帖最后由 转会但姿势丶 于 2020-2-17 16:05 编辑

4goodworld 发表于 2020-2-17 15:31
因为我感觉正常的编译的话编译器会报错
我通过OD,简单修改下,将char i=254,返回的结果是-2,



我现在已经理解了,char的取值范围在-128~127之间,只要“i”的值在256之内,编译器都会把它转换为二进制,但当第一个字符位为“1”时,该二进制为负数,编辑器就会把除了第一个字符位以外的其它字符位上的“1”变为“0”、“0”变为“1”。
如:255的二进制是1 1 1 1 1 1 1 1,除第一个字符位以外,其它字符位上的“1”变为“0”、“0”变为“1”,所以
1 1 1 1 1 1 1 1就变为1 0 0 0 0 0 0 0,而1 0 0 0 0 0 0 0等于十进制上的-1。
希望对你们有所帮助!

Sungne_jer 发表于 2020-2-17 13:05:28

这段代码真的可以运行吗?i = 255是能编译的吗?

chxchxkkk 发表于 2020-2-17 13:09:18

char的取值范围是 -128-127,255显然溢出了

zltzlt 发表于 2020-2-17 13:37:28

超出了 char 能表示的范围,可以试试 unsigned char

转会但姿势丶 发表于 2020-2-17 15:11:52

chxchxkkk 发表于 2020-2-17 13:09
char的取值范围是 -128-127,255显然溢出了

只要溢出了,最后的值都会是-1吗?

4goodworld 发表于 2020-2-17 15:31:25

转会但姿势丶 发表于 2020-2-17 15:11
只要溢出了,最后的值都会是-1吗?


因为我感觉正常的编译的话编译器会报错
我通过OD,简单修改下,将char i=254,返回的结果是-2,

具体原则
请参考百度知道:https://zhidao.baidu.com/question/100046409.html
或许会有启发
页: [1]
查看完整版本: 设一个字符型变量i,赋值为255然后在printf中用%d打印出来,结果为啥是-1?