数据类型转换

时间:2021-08-29 04:47:03
VS 2010下如下代码:


#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    char c = 128;
printf("%d\n", c);
system("pause");
return 0;
}



结果:-128

我想问的是:一个字节的char表示的范围应该是-128 ~ 127,但是128超出了char的表示范围,这时候我觉得应该是1 0000 0000 啊,如果输出c的话,去掉最高位,剩下的应该是0啊,为什么输出的是-128呢?

12 个解决方案

#1


char c = 128; 这个其实在计算机内部存储的时候地址&c的位置存储的形式就是: 1000 0000
printf("%d\n", c); 当你用pintf打印出来的时候,你的格式是”%d“,因此在printf运行时,其对数据1000 0000的解析就是按照%d来解析的,所以会是128

#2


补充一下,”其对数据1000 0000的解析就是按照%d来解析的,所以会是128“ 这里有个笔误, 结果应该是-128. 1000 0000 是-128的补码 

#3


char c = 128;
常数默认为int型。
128int型补码为0x80;
强制转为为char型,0x80作为补码,在char型中,就是-128;

#4


作为int型,128是正数,补码和原码一样,都是 0000 0000 0000 0000 0000 0000 1000 0000;
赋给char型,自动截取,变为 1000 0000;
作为char型的补码,1000 0000就是-128.。。。

#5


baidu或者google一下补码就清楚了

#6


引用 1 楼 breakfisher 的回复:
char c = 128; 这个其实在计算机内部存储的时候地址&c的位置存储的形式就是: 1000 0000
printf("%d\n", c); 当你用pintf打印出来的时候,你的格式是”%d“,因此在printf运行时,其对数据1000 0000的解析就是按照%d来解析的,所以会是128

看清楚了,是-128哦,不是128哦。 数据类型转换

#7



char c = 128;  

int d = c;

printf("%d\n", c); 


设断点,看看 c, d 的值

google  带符号位扩展

#8


一个字节8位,计算机存储的都是补码
128的补码是0 1000 0000,因为char只能存储8位,去掉最高位
变成1000 0000,1000 0000再作为char的补码,还原成原码,就是-128了

#9


引用 8 楼 anhuizhuanjiao 的回复:
一个字节8位,计算机存储的都是补码
128的补码是0 1000 0000,因为char只能存储8位,去掉最高位
变成1000 0000,1000 0000再作为char的补码,还原成原码,就是-128了


++ 

#10


引用 7 楼 AnYidan 的回复:
C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展

丹姐,你看:

数据类型转换

显示c,d都是等于-128的,都不知道怎么分析了。

#11


1、char类型的128就是-128;
2、扩展为int类型,会扩展符号位至ffffff80,值仍然是-128;
3、unsigned char的128才是真正的128;
4、%c打印的字符(表现为看不懂的符号),%d打印的是-128。

引用 10 楼 didijiji 的回复:
引用 7 楼 AnYidan 的回复:C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展
丹姐,你看:



显示c,d都是等于-128的,都不知道怎么分析了。

#12


引用 10 楼 didijiji 的回复:
引用 7 楼 AnYidan 的回复:
C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展
丹姐,你看:



显示c,d都是等于-128的,都不知道怎么分析了。


用 hex 格式显示

#1


char c = 128; 这个其实在计算机内部存储的时候地址&c的位置存储的形式就是: 1000 0000
printf("%d\n", c); 当你用pintf打印出来的时候,你的格式是”%d“,因此在printf运行时,其对数据1000 0000的解析就是按照%d来解析的,所以会是128

#2


补充一下,”其对数据1000 0000的解析就是按照%d来解析的,所以会是128“ 这里有个笔误, 结果应该是-128. 1000 0000 是-128的补码 

#3


char c = 128;
常数默认为int型。
128int型补码为0x80;
强制转为为char型,0x80作为补码,在char型中,就是-128;

#4


作为int型,128是正数,补码和原码一样,都是 0000 0000 0000 0000 0000 0000 1000 0000;
赋给char型,自动截取,变为 1000 0000;
作为char型的补码,1000 0000就是-128.。。。

#5


baidu或者google一下补码就清楚了

#6


引用 1 楼 breakfisher 的回复:
char c = 128; 这个其实在计算机内部存储的时候地址&c的位置存储的形式就是: 1000 0000
printf("%d\n", c); 当你用pintf打印出来的时候,你的格式是”%d“,因此在printf运行时,其对数据1000 0000的解析就是按照%d来解析的,所以会是128

看清楚了,是-128哦,不是128哦。 数据类型转换

#7



char c = 128;  

int d = c;

printf("%d\n", c); 


设断点,看看 c, d 的值

google  带符号位扩展

#8


一个字节8位,计算机存储的都是补码
128的补码是0 1000 0000,因为char只能存储8位,去掉最高位
变成1000 0000,1000 0000再作为char的补码,还原成原码,就是-128了

#9


引用 8 楼 anhuizhuanjiao 的回复:
一个字节8位,计算机存储的都是补码
128的补码是0 1000 0000,因为char只能存储8位,去掉最高位
变成1000 0000,1000 0000再作为char的补码,还原成原码,就是-128了


++ 

#10


引用 7 楼 AnYidan 的回复:
C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展

丹姐,你看:

数据类型转换

显示c,d都是等于-128的,都不知道怎么分析了。

#11


1、char类型的128就是-128;
2、扩展为int类型,会扩展符号位至ffffff80,值仍然是-128;
3、unsigned char的128才是真正的128;
4、%c打印的字符(表现为看不懂的符号),%d打印的是-128。

引用 10 楼 didijiji 的回复:
引用 7 楼 AnYidan 的回复:C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展
丹姐,你看:



显示c,d都是等于-128的,都不知道怎么分析了。

#12


引用 10 楼 didijiji 的回复:
引用 7 楼 AnYidan 的回复:
C/C++ code?123456char c = 128;   int d = c;     printf("%d\n", c); 

设断点,看看 c, d 的值

google  带符号位扩展
丹姐,你看:



显示c,d都是等于-128的,都不知道怎么分析了。


用 hex 格式显示