关于uint64_t类型变量赋值,防止overflow错误
2013-04-20 16:40
295 查看
最近在公司做项目发现uint64_t类型的变量赋值时,发生overflow的错误。先就此写了以下的测试程序,希望对大家有所帮助。
结论:对于uint64_t类型变量进行赋值操作时,需要显示的指定右操作数是uint64_t类型的(虽然在右操作数比较小的情况下,比如1000等,不会出现overflow的错误)。
显示指定有两种方方式加上llu后缀,或者添加强制类型转换(uint64_t)。
另对于将一个计算的表达式赋给一个uint64_t类型的变量,比如:
要在第一个1024后添加llu后缀或者强制类型转换添加(uint64_t)。
#include <stdlib.h> /* * Copyright 徐洪志(Macrosan). All rights reserved. * Data: 2013-4-20 */ // // 此程序是演示了对uint64_t类型变量的赋值 #include <stdio.h> #define DEF_TEST(size) (size) typedef unsigned long long int uint64_t; int main(void) { uint64_t lba = 0; lba = 1024*1024*1024*1024*1024*1024; //2^60 Error printf("lba: %llu\n", lba); lba = 1024*1024*1024*1024*1024*1024llu; //2^60 Error printf("lba: %llu\n", lba); lba = 1024llu*1024*1024*1024*1024*1024; //2^60 Right printf("lba: %llu\n", lba); lba = (uint64_t)1024*1024*1024*1024*1024*1024; //2^60 Right printf("lba: %llu\n", lba); lba = DEF_TEST(1024*1024*1024*1024*1024*1024); //2^60 Error printf("lba: %llu\n", lba); lba = DEF_TEST(1024*1024*1024*1024*1024*1024llu); //2^60 Error printf("lba: %llu\n", lba); lba = DEF_TEST(1024llu*1024*1024*1024*1024*1024); //2^60 Right printf("lba: %llu\n", lba); lba = (uint64_t)DEF_TEST(1024*1024*1024*1024*1024*1024); //2^60 Error printf("lba: %llu\n", lba); lba = DEF_TEST((uint64_t)1024*1024*1024*1024*1024*1024); //2^60 Right printf("lba: %llu\n", lba); lba = DEF_TEST(1024*1024*1024*1024*1024*1024llu); //2^60 Error printf("lba: %llu\n", lba); #define BIG_NUM 1024*1024*1024*1024*1024*1024 //2^60 宏定义 lba = DEF_TEST(BIG_NUM); //2^60 Error printf("lba: %llu\n", lba); lba = DEF_TEST((uint64_t)BIG_NUM); //2^60 Right printf("lba: %llu\n", lba); return 0; }上述代码执行结果:
lba: 0 lba: 0 lba: 1152921504606846976 lba: 1152921504606846976 lba: 0 lba: 0 lba: 1152921504606846976 lba: 0 lba: 1152921504606846976 lba: 0 lba: 0 lba: 1152921504606846976
结论:对于uint64_t类型变量进行赋值操作时,需要显示的指定右操作数是uint64_t类型的(虽然在右操作数比较小的情况下,比如1000等,不会出现overflow的错误)。
显示指定有两种方方式加上llu后缀,或者添加强制类型转换(uint64_t)。
另对于将一个计算的表达式赋给一个uint64_t类型的变量,比如:
lba = 1024*1024*1024*1024*1024*1024;
要在第一个1024后添加llu后缀或者强制类型转换添加(uint64_t)。
1) lba = 1024llu*1024*1024*1024*1024*1024;
2) lba = (uint64_t)1024*1024*1024*1024*1024*1024;
相关文章推荐
- 使用bool 类型变量赋值时的一个错误
- 关于number类型变量的赋值!!!!
- 关于在mysql触发器中变量(prefixed with @)赋值错误的问题
- 关于结构体对其方式错误引起的变量赋值错误
- 防止Sql注入字符串 , 变量赋值时防止为空和类型转换
- SQL不是同一类型的变量赋值最好转换成统一类型,否则引起莫名错误
- hibernate中实体类构造方法中含有Timestamp 类型变量的"no appropriate constructor.." 错误提示的解决办法
- 关于bat的变量赋值和解析机制
- 关于导入数据库dmp时遇到的错误 “ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”
- 争求一下建议呀,关于是否加类型前缀在变量名前
- (一):T-SQL语言分类、基本数据类型、定义变量及赋值
- 关于编译错误--提领指向不完全类型的指针
- 关于ajax中success返回值赋值给全局变量undefined
- 关于MyEclipse8.5 错误 background indexer crash recovery java.lang.stackoverflowerror
- Xman整理篇___关于Python的基础内容(变量和简单数据类型)
- 引用类型变量的赋值
- pl/sql中如何给boolean类型的变量赋值
- 关于 mysql的 datatime类型默认值 0000-00-00 00:00:00 错误或者说没办法创建类型为时间的问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 变量_类型转换_ 算术运算符_转义字符_赋值和比较运算符_逻辑运算符_位运算符