TC397 64bit打印 加乘溢出判断 移位运算

编译环境: Aurix Development Studio 1.5.0

8,16,32,64bit最大值, 十进制/十六进制打印, 测试代码:

#include <limits.h> // ULLONG_MAX ... 
#incldue <stdint.h>	// uint64_t ...
#define ENDLINE     "\n\r"

Ifx_Console_print(ENDLINE);
Ifx_Console_print(ENDLINE"SCHAR_MAX =%d, 0x%02X", SCHAR_MAX, SCHAR_MAX);
Ifx_Console_print(ENDLINE"UCHAR_MAX =%d, 0x%02X", UCHAR_MAX, UCHAR_MAX);
Ifx_Console_print(ENDLINE"SHRT_MAX  =%d, 0x%04X", SHRT_MAX , SHRT_MAX );
Ifx_Console_print(ENDLINE"USHRT_MAX =%d, 0x%04X", USHRT_MAX, USHRT_MAX);
Ifx_Console_print(ENDLINE"LONG_MAX  =%d, 0x%08X", LONG_MAX , LONG_MAX );
Ifx_Console_print(ENDLINE"ULONG_MAX =%u, 0x%08X", ULONG_MAX, ULONG_MAX);
Ifx_Console_print(ENDLINE"LLONG_MAX =%lld, 0x%016llX", LLONG_MAX, LLONG_MAX);
Ifx_Console_print(ENDLINE"ULLONG_MAX=%llu, 0x%016llX", ULLONG_MAX, ULLONG_MAX);
Ifx_Console_print(ENDLINE);

/*
SCHAR_MAX =127, 0x7F
UCHAR_MAX =255, 0xFF
SHRT_MAX  =32767, 0x7FFF
USHRT_MAX =65535, 0xFFFF
LONG_MAX  =2147483647, 0x7FFFFFFF
ULONG_MAX =4294967295, 0xFFFFFFFF
LLONG_MAX =9223372036854775807, 0x7FFFFFFFFFFFFFFF
ULLONG_MAX=18446744073709551615, 0xFFFFFFFFFFFFFFFF
*/

64bit运算, 加乘溢出判断:

char is_uint64_mul_overflow(uint64_t a, uint64_t b) 
{
    return ((ULLONG_MAX / a) < b);
}

char is_uint64_plus_overflow(uint64_t a, uint64_t b) 
{
    return ((ULLONG_MAX - a) < b);
}

uint64_t a = 0x2FFFFFFFFFFFFFFF;
uint64_t b = 0x1FFFFFFFFFFFFFFF;
uint64_t c;
Ifx_Console_print(ENDLINE"a=0x%016llX", a);
Ifx_Console_print(ENDLINE"b=0x%016llX", b);
c = a+b;
Ifx_Console_print(ENDLINE"a+b=%llu, 0x%016llX, overflow: %d", c, c, is_uint64_plus_overflow(a,b));
c = a-b;
Ifx_Console_print(ENDLINE"a-b=%llu, 0x%016llX", c, c);
c = a*b;
Ifx_Console_print(ENDLINE"a*b=%llu, 0x%016llX, overflow: %d", c, c, is_uint64_mul_overflow(a,b));
c = a/b;
Ifx_Console_print(ENDLINE"a/b=%llu, 0x%016llX", c, c);
Ifx_Console_print(ENDLINE);

a = 0xBFFFFFFFFFFFFFFF;
b = 0xAFFFFFFFFFFFFFFF;
Ifx_Console_print(ENDLINE"a=0x%016llX", a);
Ifx_Console_print(ENDLINE"b=0x%016llX", b);
c = a+b;
Ifx_Console_print(ENDLINE"a+b=%llu, 0x%016llX, overflow: %d", c, c, is_uint64_plus_overflow(a,b));
c = a-b;
Ifx_Console_print(ENDLINE"a-b=%llu, 0x%016llX", c, c);
c = a*b;
Ifx_Console_print(ENDLINE"a*b=%llu, 0x%016llX, overflow: %d", c, c, is_uint64_mul_overflow(a,b));
c = a/b;
Ifx_Console_print(ENDLINE"a/b=%llu, 0x%016llX", c, c);
Ifx_Console_print(ENDLINE);

/*
a=0x2FFFFFFFFFFFFFFF
b=0x1FFFFFFFFFFFFFFF
a+b=5764607523034234878, 0x4FFFFFFFFFFFFFFE, overflow: 0
a-b=1152921504606846976, 0x1000000000000000
a*b=12682136550675316737, 0xB000000000000001, overflow: 1
a/b=1, 0x0000000000000001

a=0xBFFFFFFFFFFFFFFF
b=0xAFFFFFFFFFFFFFFF
a+b=8070450532247928830, 0x6FFFFFFFFFFFFFFE, overflow: 1
a-b=1152921504606846976, 0x1000000000000000
a*b=10376293541461622785, 0x9000000000000001, overflow: 1
a/b=1, 0x0000000000000001
*/

64bit移位运算:

uint32_t x = 0x12345678;
uint32_t y = 0x9ABCDEF0;
uint64_t z;
z = (x << 32) | y;
Ifx_Console_print(ENDLINE"z=0x%016llX", z);
z = ((uint64_t)x << 32) | y;	//正确的
Ifx_Console_print(ENDLINE"z=0x%016llX", z);	//正确的
Ifx_Console_print(ENDLINE"z=0x%016X, z=0x%016llX", z, z); 	//奇怪的
Ifx_Console_print(ENDLINE"z=0x%016llX", z);
Ifx_Console_print(ENDLINE);

/*
z=0x000000009ABCDEF0
z=0x123456789ABCDEF0
z=0x000000009ABCDEF0, z=0x9ABCDEF012345678
z=0x123456789ABCDEF0
*/

参考: C/C++ 判断两个整数相乘是否溢出_weixin_30721899的博客-CSDN博客

欢迎关注微信公众号:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值