c语言类型检测,C语言的类型 - sundaqing的个人空间 - OSCHINA - 中文开源技术交流社区...

C语言的数据类型

类型的位宽

相比于高级语言,C语言的整型数据类型都有固定位宽,即类型占多少位。比如下面的数据类型:

signed char

unsigned char

signed short

unsigned short

signed int

unsigned int

signed long

unsigned long

signed long long

unsigned long long

由于平台的不同,这些类型的位宽可能有些不相同,但是可以确定的是,每个平台都有固定的位宽。为了在编程过程中明确指定位宽,增加代码的可读性和避免对平台依赖,各个平台都定义了自己指定位宽的基本类型,如Linux平台上在stdint.h头文件就定义了如下类型

int8_t

uint8_t

int16_t

uint16_t

int32_t

uint32_t

int64_t

uint64_t

每个类型都指定了符号和位宽,从字面上就可以看到这个类型的位宽是多少。由于位宽的存在,导致每个类型都有自己的最大值和最小值,比如Linux又分别定义了每种类型的最大值和最小值(无符号数的最小值都是0)

INT8_MIN

INT8_MAX

INT16_MIN

INT16_MAX

INT32_MIN

INT32_MAX

INT64_MIN

INT64_MAX

UINT8_MAX

UINT16_MAX

UINT32_MAX

UINT64_MAX

有了这些定义,C语言的运算基本都要都要这些边界值,否则就会造成传说中的整数溢出问题。如加法和乘法运算就要做如下判断:

//计算两个值的和

uint32_t sum(uint32_t a, uint32_t b)

{

/*先判断加法以后是否会溢出

注意这里不能用 (a+b)

if ((UINT32_MAX - a) < b)

{

//error

}

return a + b;

}

//计算两个值的乘积

uint32_t mul(uint32_t a, uint32_t b)

{

/*先判断乘积以后是否会溢出

注意这里不能用 (a*b)

if ((UINT32_MAX / a) < b)

{

//error

}

return a * b

}

类型的符号

C语言的整型数据类型都包含符号修饰符:signed (有符号)或者unsigned(无符号),但是符号修饰符并不影响数据真实的值,比如我们定义如下值:

signed char a = -1

unsigned char b = (signed char)a;

从内存的内容来讲,a的内存和b的内存是一致的,都是11111111,没什么区别,但是符号修饰符会影响逻辑判断的结果,比如虽然这两个值在内存上没什么区别,但是如果下比较会返回相反的结果:

signed char a = -1

unsigned char b = (signed char)a;

//成立

if (a < 0)

{

printf("a < 0\n");

}

//成立

if (b > 0)

{

printf("b > 0\n");

}

除了符号会影响逻辑判断之外,C语言的默认转换也会影响逻辑判断的结果,如下面的比较在不同的情况下,结果就不同

signed char a = -1

unsigned char b = (signed char)a;

//不成立,a没有转换为`unsigned char`

if (a > (unsigned char)0)

{

printf("unsigned char a > 0\n");

}

//不成立,a没有转换为`unsigned short`

if (a > (unsigned short)0)

{

printf("unsigned char a > 0\n");

}

//成立,a转换为`unsigned int`

if (a > (unsigned int)0)

{

printf("unsigned int a > 0\n");

}

看以看到,由于符号和默认转换的存在,C语言的逻辑运算有可能出现不同的结果,所以在实际项目中,一般都鼓励通符号和同位宽的类型进行比较,如果不同,需要使用者自己处理转换,使之成为符号和位宽相同的类型。

总结

C语言的类型有位宽的限制,加法和乘法运算需要判断溢出情况

C语言的类型有有符号和无符号区别,在逻辑运算方面,最好自己处理成同符号同位宽的类型,避免默认转来带来的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值