c 语言里 类型转换那些事儿

一: 起因

(1)最近接触了类型转换,例如有符号数转化为无符号数 ---- int 转化为 unsigned int类型,莫要想当然的转化;

(2)弥补一下自己当初学习计算机组成原理时,原码、反码、补码就比较容易混淆的概念;

(3)double类型的如何判断某一个参数是否为零,直接 == 0.0,,貌似可以 ---- 确实有时可以,但是有时却不可以,这是为什么?

(4)知识补充:在int 有符号数中:0x80000000 (除了符号位为1,其余全部为零) ---- 最小的数(-2147483648即-2^32) ;

0x80000001 ---- 次最小数( -2147483647即-2^32-1); 

0xFFFFFFFE (-2) ;0xFFFFFFFF(连同符号位全部是1) ----- 最大的负整数(-1);

 0x7FFFFFF (除了符号位为0,其余全部为1)---- 最大的数(2147483647即2^32-1)

(5)问题是 0x80000000 - 1 是多少呢?(最大的数0x7FFFFFF); 0x7FFFFFF
 + 1又是多少呢?(最小的数0x80000000 );

0x80000000 - 1 是如何计算的吗?(0x80000000 + 0xFFFFFFFF,先把减法变化为加法,即正1变化为负1,溢出位舍掉)

二:看真相

(1)代码

      int min_int = 0x80000000;
      int int_fu1 = 0xffffffff;
      int max_int = 0x7FFFFFFF;
      cout << "min_int= " << min_int << "\tmin_int-1= " << min_int-1 <<
      "\t(unsigned)min_int = " << (unsigned int)min_int << endl;
      cout << "int_fu1= " << int_fu1 << "\tint_fu1-1= " << int_fu1-1 <<
      "\t(unsigned)int_fu1 = " << (unsigned int)int_fu1 << endl;
      cout << "0x7FFFFFFF= " << 0x7FFFFFFF << "\t0x7FFFFFFF-1= " << 0x7FFFFFFF +1 << endl;
      double test_zero = 1.333333;
      cout << (test_zero-1.3333334) << endl;
      if(0 == (test_zero-1.3333334))
        cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) <<
        "\t0 == (test_zero-1.3333334)" << endl;
      else if((test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6)
        cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) <<
        "\t(test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6" << endl;

(2)结果图

(3)结果分析

        浮点数(double)之所以不能用 == 和 != 是因为浮点数在内存中都是按精度来存储的(有最大精度位数,也可以设定精度位数),所以你看到的 3.12也许本来是3.123456取的小数点后2位位精度,所以当与另一个 3.12进行比较时可能会出现很多种情况,如果另一个3.12其实是3.121111取的小数点后2位位精度的话,那么两个数你看着相等,其实是不等的。

      所以你办在对浮点数进行比较的时候一般都是相减然后去和一个精度比较。但是有时,比较确实可以通过,因为那是侥幸。

可以看到最小数 和 最大数之后一步之遥。

       原码 反码 补码 的知识补充

(4)相关学习    c++中的悬浮指针和野指针
二级指针
       我不是一个合格的程序员   再一次感觉到自己的无知  

        c++深拷贝和浅拷贝 
   面试经常问的C语言变量在内存中的分布(VC6.0)

时间: 2024-11-08 10:55:31

c 语言里 类型转换那些事儿的相关文章

c语言里NULL的理解

NULL一看名字就知道为空,什么为空呢,而且全是大写.是不是意味着是个宏定义呢?如果想到这里,我相信你离真理不远了. 有些人为什么犯错?因为只看到了NULL这四个字母而已,没有看到事物的本质,老师在课堂上也只是说空指针,空字符串..这样只会陷入无止境的误区.如果我这样定义: #define NULL 0 你是不是又该纠结了呢? 正确的做法是把它当作一个宏,不管如何变化,来展开看看就知道了. 在C语言的头文件stddef.h中,NULL的定义如下: #define NULL #define __c

[原创]C语言里为何会有“2+2=5”的结果

原文链接:C语言里为何会有“2+2=5”的结果 写这篇原创文章是因为看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,其中C语言是这样实现的: 1 int main() { 2 char __func_version__[] = “5″; // For source control 3 char b[]=”2″, a=2; 4 printf(“%d + %s = %s\n”, a, b, a+b); 5 return 0; 6 } 有些童鞋可能会说,这不是偷换概念吗,拿字符串和int相

C语言里全局变量管理

C语言里信息封装比較弱,仅仅有静态变量的文件作用域. 假设不加约束.非常easy造成全局变量满天飞. 假设定义一个全局结构体.把全局变量都放到这个GlobleVariate里,应该好管一些,至少比裸奔文雅一点. 更进一步,每一个模块定义自己的结构体.把模块公共变量放到结构体里.这样把GlobleVariate拆成多个小结构体,会更文雅一些. 大概的伪代码是以下这个样子. struct GlobleVariate { struct ModuleVariate1: struct ModuleVari

C语言里为何会有“2+2=5”的结果

写这篇原创文章是因为看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,其中C语言是这样实现的: int main() { char __func_version__[] = "5″; // For source control char b[]="2″, a=2; printf("%d + %s = %s\n", a, b, a+b); return 0; } 有些童鞋可能会说,这不是偷换概念吗,拿字符串和int相加,是滴,但在这里请这些童鞋暂且

const分别在C和C++语言里的含义和实现机制

const的含义        简单地说:const在c语言中表示只读的变量,而在c++语言中表示常量. C语言 const是constant的缩写,是恒定不变的意思,也翻译为常量,但是很多人都认为被const修饰的值都是常量,其实这是不精确的.因为,精确来说应该是只读的变量,其值在编译的时候不能被使用,因为编译器在编译的时候不知道其存储的内容.或许当初这个关键字应该被替换为readonly. C语言中const定义的变量只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,

嵌入式C语言里的土豪们之除法与移位

土豪这个词用在接下来要出场的C语言再合适不过了.他们在嵌入式C语言里占尽了奢华,但是毕竟我们更需要一个节约型的微生态环境.在这里简单给大家分析一下嵌入式C语言编程时用到的除法与移位. 本文引用地址:http://www.eepw.com.cn/article/182359.htm 除法土豪 除法在嵌入式微处理器里可算是一个消耗大户,复杂的实现方式不仅占用了大师宝贵的计算时间而且精度有限情况下占用了大片的RAM.因此,常常在各类文章里看到,编程人员应该使用右移运算来代替除法.这个右移方法没有问题,

理解Python语言里的异常(Exception)

Exception is as a sort of structured "super go to".异常是一种结构化的"超级goto". 作为一个数十年如一日地钟爱C语言的程序员(因为C程序员需要记忆的关键字很少,而且可以很惬意地玩内存),对于高级语言如Python里的异常(Exception)一直不甚理解,尤其是其实现机理.但读了<Learning Python>一书中上面这句话(尤其是goto关键字)后,忽然豁然开朗. 如果用C语言编写一个鲁棒性良

数据分析和R语言的那点事儿_1

最近遇到一些程序员同学向我了解R语言,有些更是想转行做数据分析,故开始学习R或者Python之类的语言.在有其他编程语言的背景下,学习R的语法的确是一件十分简单的事.霸特,如果以为仅仅是这样的话那就图样图森破. 首先,数据分析是一个非常庞杂的职能,也许岗位抬头均为数据分析师的两人,做的事情却大不相同——比如使用hadoop做日志统计和使用Excel处理报表,这简直是两个领域,相互之间的职能了解,可能仅为对方工作的冰山一角. 其次,无论任何行业的数据分析,其日常工作主要为以下几块: 数据获取——数

C语言里字符串的解析

原文网摘:http://www.cnblogs.com/yi-meng/p/3620244.html#undefined 根据给定的字符串,按照一定规则解析字符串,卡住好几次,这次做个笔记,以供参考 函数名称:   strtok 函数原型:   char *strtok(char *s1, const char *s2) 函数功能:   分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词) 函数返回:   字符串s1中首次出现s2中的字符前的子字符串指针 参数说明:   s