c51语言如何检测溢出,c – 编译器在编译时如何检测编号溢出?

编译器将源代码作为字符串处理,所以在C中,例如当它鼓励语句如unsigned char x = 150;它从类型限制中知道unsigned char必须在0到255之间.

我的问题是数字150仍然是字符串,编译器使用什么算法来比较数字序列 – 在这种情况下为150 – 对类型限制?

我为一个十进制,八进制,十六进制和小端二进制的类型’int’做了一个简单的算法,但我不认为编译器会这样做以检测数字溢出.

我所做的算法用C编码:

typedef signed char int8;

typedef signed int int32;

#define DEC 0

#define HEX 1

#define OCT 2

#define BIN 3

bool isOverflow(const char* value, int32 base)

{

// left-most digit for maximum and minimum number

static const char* max_numbers[4][2] =

{

// INT_MAX INT_MIN

{ "2147483647", "2147483648" }, // decimal

{ "7fffffff", "80000000" }, // hexadecimal

{ "17777777777", "20000000000" }, // octal

{ "01111111111111111111111111111111", "10000000000000000000000000000000" } // binary

};

// size of strings in max_numbers array

static const int32 number_sizes[] = { 10, 8, 11, 32 };

// input string size

int32 str_len = strlen(value);

// is sign mark exist in input string

int32 signExist = ((base == DEC || base == OCT) && *value == '-');

// first non zero digit in input number

int32 non_zero_index = signExist;

// locate first non zero index

while(non_zero_index < str_len && value[non_zero_index] == 0) non_zero_index++;

// if non_zero_index equal length then all digits are zero

if (non_zero_index == str_len) return false;

// get number of digits that actually represent the number

int32 diff = str_len - non_zero_index;

// if difference less than 10 digits then no overflow will happened

if (diff < number_sizes[base]) return false;

// if difference greater than 10 digits then overflow will happened

if (diff > number_sizes[base]) return true;

// left digit in input and search strings

int8 left1 = 0, left2 = 0;

// if digits equal to 10 then loop over digits from left to right and compare

for (int32 i = 0; non_zero_index < str_len; non_zero_index++, i++)

{

// get input digit

left1 = value[non_zero_index];

// get match digit

left2 = max_numbers[signExist][i];

// if digits not equal then if left1 is greater overflow will occurred, false otherwise

if (left1 != left2) return left1 > left2;

}

// overflow won't happened

return false;

}

可以优化该算法以适用于所有整数类型,但是使用浮点数我必须使用新的算法来处理IEEE浮点表示.

我认为编译器使用有效的算法来检测除了我的溢出,不是吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值