今天在工作中遇到一个问题,而在解决问题的过程中,发现一段关于int 型变量(a)和char型(b)变量间类型转换的代码存在问题:一个值为255的int型变量a,强制类型转换并赋值给char型变量b后,b的值是-1,而不是255。虽然要解决的问题并不是由于这段代码导致的,但是这个细节在C编程中还是挺重要的,因此晚上下班回来后在自己的笔记本电脑上对这一问题进行了简单测试和整理,算是给自己个提醒,于是有了下面的这段代码:
#include <stdio.h>
iint main(void)
{
iint a = 255;
char ch;
short sh;
unsigned char uc;
unsigned short us;
ch = (char)a;
sh = (short)a;
uc = (unsigned char)a;
us = (unsigned short)a;
printf("ch = %d, sh = %d, uc = %d, us = %d\n", ch, sh, uc, us);
printf("size: \nchar[%d], short[%d], unsigned char[%d], unsigned short[%d]\n",\
sizeof(char), sizeof(short), sizeof(unsigned char), sizeof(unsigned short));
return 0;
}
编译后运行的结果是:
ch = -1, sh = 255, uc = 255, us = 255
size:
char[1], short[2], unsigned char[1], unsigned short[2]
注: 笔记本电脑是Intel Core I3处理器, 操作系统是 CentOS7_X86_64,内核 3.10.0
问题分析:
由于char型变量占1个字节,但最高位是作为符号位的,因此值范围是 -128 ~ 127, unsigned char型变量也占1个字节,但没有符号位,因此值范围是 0 ~ 255, short型和unsigned short型都占2个字节,因此出现上述结果不足为奇。对于这个问题,下面这篇博客分析的很清楚:http://blog.csdn.net/daiyutage/article/details/8575248
虽然只是个很小的问题,但由此可以给自己两点提醒:
1) 不要过于依赖强制类型转换,一个变量在定义时就应该根据其可能的值范围选择合适的变量类型;
2)编写代码时一定要细心,不要忽略了细节,否则有可能会导致一些很奇怪的问题,并且排查起来非常难!
3)细心!注重细节!