c语言无符号整型 一直累加 溢出

您所在的位置:网站首页 累加符号c语言 c语言无符号整型 一直累加 溢出

c语言无符号整型 一直累加 溢出

2024-06-30 04:47| 来源: 网络整理| 查看: 265

在学习nginx的源码时看到了这样的一个转换,不明白,查了一下,找到了这样的一篇文章,转过来了。

nginx中的代码:

case 'M':

ms = (ngx_msec_t) va_arg(args, ngx_msec_t);

/* judge if ms equals 0xffffffff */

if ((ngx_msec_int_t) ms == -1) {

sign = 1;

i64 = -1;

} else {

sign = 0;

ui64 = (uint64_t) ms;

}

/

C语言中存在两种整数算术运算,有符号型和无符号型。无符号数运算:所有无符号数运算都是以2的n次方为模,(n是结果中的位数)。所以它不存在运算时的没有那种所谓的“溢出”,当它超过范围时,从零开始重新计数!当一个无符号数和有符号数相加的时候,有符号数会自动转化为无符号数参与运算!有符号数运算: 是可能发生“溢出”的,而且“溢出”的结果不固定。

关于无符号数减去无符号数的用法错误:

if ( i - j >=0) 假如i,j为无符号数,这样写可能会引发错误,即当i小于j的时候,这个式子仍然成立,因为无符号数始终是大于等于零的。例: if ( strlen( a ) >= 10) 与 if (strlen ( b ) -10 >= 0) 这两条语句是不相等的 ,因为strlen函数返回的是无符号数类型。

ANSI C规定在无符号整数和有符号整数之间进行强制类型转换时,位模式不应该改变。类型转换并未改变对象的位模式,改变的是位模式的解释方式。

有符号数转换为无符号数时,负数转换为大的正数(可以理解为原值加上2的n次方),而正数保持不变。

无符号数转换为有符号数时,对于小的数将保持原值,对于大的数则转换为负数(可以理解为原值减去2的n次方)。

参考:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3