目录

C语言数据类型谜题总结

如果int x<0为真,那么(x*2)<0是否一定正确?

unsigned int ux一定大于等于0么?

如果(x&7)==7,那么(x<<30)<0一定正确么?

如果x>y,那么-x < -y一定正确么?

x为int类型,那么x*x>=0一定正确么?

x为int类型,那么(x>>3)==(x/8)一定正确么?

x为int类型,那么(x|-x) >> 31 == -1一定正确么?

x为int类型,那么x&(x-1) != 0一定正确么?

x为int类型,那么x==(int)(float)x一定正确么?

x为int类型,那么x==(int)(double)x一定正确么?

2/3 == 2/3.0正确么?

如果x<=0,那么-x>=0一定正确么?


C语言数据类型谜题总结

前提:

int x, y;

unsigned ux = x;

unsigned uy = y;

如果int x<0为真,那么(x*2)<0是否一定正确?

错误:溢出,严格上是下溢(underflow)

#include <stdio.h>
#include <assert.h>
int main()
{int x = 0x80000000;assert(x<0);assert(x*2<0);    //这里报错啦!return 0;
}

我们可以看出来,当x=0x80000000(-2147483648)的时候,x*2=>-4294967296。但是我们知道在x86结构中,int可以表达的范围是从-2147483648 ~ 2147483647。很明显-4294967296已经超出我们可以用int表达的范围。

unsigned int ux一定大于等于0么?

正确:unsigned int类型只可以表示非负数的数字。

如果(x&7)==7,那么(x<<30)<0一定正确么?

正确:因为(x&7)==7正确的意思就是说在x的后三位上等于(0x111)。所以在右移30位之后,最高有效位(MSB)一定是1。我们知道如果int类型的最高有效位(MSB)是1的话,那么x一定是负数(根据2's complement)。

x ******** ******** ******** ********
7 00000000 00000000 00000000 00000111
x&7==7 ******** ******** ******** *****111
x<<30 111***** ******** ******** ********

如果x>y,那么-x < -y一定正确么?

错误:因为如果x=0,y=INT_MIN的话,-x依然为0,但是-y无法正确表示,在2's complement的补码下,-y依然会是INT_MIN。

实例如下:

#include <stdio.h>
#include <assert.h>
int main()
{int x = 0;int y = 0x80000000;printf("x: %d\n", x);printf("-x: %d\n", -x);printf("y: %d\n", y);printf("-y: %d\n", -y);return 0;
}

结果如下:

x: 0
-x: 0
y: -2147483648
-y: -2147483648 

x为int类型,那么x*x>=0一定正确么?

错误:因为会存在溢出,示例如下:

#include <stdio.h>
#include <assert.h>
int main()
{int x = 0x0000FFFF;printf("x: %d\n", x);printf("x*x: %d\n", x*x);return 0;
}

结果如下:

x: 65535
x*x: -131071 

x为int类型,那么(x>>3)==(x/8)一定正确么?

错误:有特殊情况,比如负数

#include <stdio.h>int main()
{int x = -10;printf("x: %d\n", x);printf("x>>3: %d\n", x>>3);printf("x/8: %d\n", x/8);return 0;
}

结果如下:

x: -10
x>>3: -2
x/8: -1

x为int类型,那么(x|-x) >> 31 == -1一定正确么?

错误:有特殊情况,当x=1的时候结果不正确,示例如下:

#include <stdio.h>int main()
{int x = 0;printf("x: %d\n", x);printf("(x|-x)>>31: %d\n", (x|-x)>>31);return 0;
}

结果如下:

x: 0
(x|-x)>>31: 0

x为int类型,那么x&(x-1) != 0一定正确么?

错误:有两种特殊情况,当x=0或者x=1时不正确,示例如下:

#include <stdio.h>int main()
{int x = 0;printf("x: %d\n", x);printf("(x|-x)>>31: %d\n", x&(x-1)!=0);x = 1;printf("x: %d\n", x);printf("(x|-x)>>31: %d\n", x&(x-1)!=0);return 0;
}

结果如下:

x: 0
(x|-x)>>31: 0
x: 1
(x|-x)>>31: 0

x为int类型,那么x==(int)(float)x一定正确么?

错误:因为浮点数转换会丢失精度,示例如下:

#include <stdio.h>int main()
{int x = 999999999;printf("x: %d\n", x);printf("(int)(float)x: %d\n", (int)(float)x);return 0;
}

结果如下:

x: 999999999
(int)(float)x: 1000000000 

x为int类型,那么x==(int)(double)x一定正确么?

正确:因为64为的double类型,有足够的fraction bits去保留int类型的精度

#include <stdio.h>int main()
{int x = 999999999;printf("x: %d\n", x);printf("(int)(double)x: %d\n", (int)(double)x);return 0;
}

结果如下:

x: 999999999
(int)(double)x: 999999999 

2/3 == 2/3.0正确么?

错误:因为2/3是正数除法,2/3.0是浮点数除法

#include <stdio.h>int main()
{printf("%d\n", 2/3);printf("%d\n", 2/3.0);
}

结果如下:

0
2147483646

如果x<=0,那么-x>=0一定正确么?

错误:如果x为INT_MIN(-2147483648)

#include <stdio.h>
#include <limits.h>
int main()
{int x = INT_MIN;printf(" x: %d, x <= 0 -> %s\n",  x, x<=0 ? "true" : "false");printf("-x: %d,-x >= 0 -> %s\n", -x, -x>=0 ? "true" : "false");return 0;
}

结果如下:

 x: -2147483648, x <= 0 -> true
-x: -2147483648, -x >= 0 -> false

(未完待续...)

C语言数据类型谜题总结相关推荐

  1. c语言定义字符类型变量的关键字,C语言数据类型

    C语言关键字: 也称保留字,是C语言预先定义的.具有特殊意义的单词. 数据类型关键字(12个): (1)char:声明字符型变量或函数 (2)double:声明双精度变量或函数 (3)enum:声明枚 ...

  2. C语言数据类型所占空间大小

    C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...

  3. R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames

    R语言数据类型:Logical.Numeric.Integer.Complex.Character.Vectors.Lists.Matrices.Arrays.Factors.DataFrames 通 ...

  4. R语言数据类型及数据类型判断

    R语言数据类型及数据类型判断 目录 R语言数据类型及数据类型判断 从存储角度看R数据类型

  5. C语言数据类型大学霸IT达人

    C语言数据类型大学霸IT达人 在人们的生活中会处理大量的数据,在处理数据之前我们会对数据进行分类.如一年有356天,12个月.在处理天和月的数据中会使用到整数.在超市的找零时我们会使用到以元为单位的小 ...

  6. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  7. 声明对象_计算机各语言数据类型及对象声明之区别

    各语言数据类型 JS中数据类型有:整数型.浮点型.String.布尔型.转义字符.未定义.空值(null) JAVA中数据类型有: byte short int long float double b ...

  8. C语言数据类型本质分析

    C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...

  9. C语言数据类型 / 变量类型 - C语言零基础入门教程

    目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...

最新文章

  1. 详说 Cookie, LocalStorage 与 SessionStorage
  2. Java学习笔记(四)--数据类型与运算符
  3. android如何创建spinner组件,Andriod开发之下拉列表控件(Spinner)的用法
  4. autocad.netQQ群:193522571属性块中属性文字宽度比例自动调整到格子宽度内,比例因子小于标准比例因子的自动设置为标准比例因子...
  5. SqlServe零碎要点---sqlserver如何使用日期计算,DateTime类型的格式化以及语法格式等等。
  6. 【汇编优化】之ARM32与AARCH64指令集优化总结
  7. CUDA精进之路(二):图像处理——形态学滤波(膨胀、腐蚀、开闭运算)
  8. php获取时间计算时间差
  9. ue 新建html,第四课 开发uehtml官网响应式静态页面(示例代码)
  10. 传说中的世界500强面试题-怪题
  11. 2022-2023中国整体薪酬趋势
  12. Django 错误信息:AttributeError: 'str' object has no attribute '_meta'
  13. matlab实现转换音频格式文件,mp3到wav的转换
  14. 使用requests爬取携程网飞机票价格实例
  15. 《UnityAPI.Vector3三维向量》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Vector3+Lerp+Cross+Dot+Slerp+立钻哥哥++OK++)
  16. 天马行空 | 假如上网装X需要花钱?
  17. Ubuntu实时监控网速、CPU、内存
  18. 关于做项目中关于文件读取遇到的一个问题(0x80070299)
  19. SAP_控制TECO生产订单不能发料及收货
  20. Qt::Key键盘按键说明

热门文章

  1. Guys, what is better than sex?
  2. 微信小程序 -语音合成:将文字转为语音(小程序插件:微信同声传译)
  3. 电商工具箱之淘宝黑号库
  4. 历史经验之解决vMix22闪退的办法(亲测管用)
  5. kali安装配置使用手册
  6. int **a[3][4]占多少字节?
  7. 真的来了,浏览器端可以直接运行Python了
  8. 如何快速修改文件的修改时间?
  9. 预测《权游》角色生死,AI算法魔力何在?
  10. Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)