unsigned
发文者的范例程式已经简化到很容易理解:先产生一个 32Kytes 的 array,然后里面塞乱数。 接下来把每个 byte 当作 unsigned char,要找出这个 array 里面所有值大于等于 128 的元素,把这些元素的值加起来。 原发文者发现,如果先把这个 array 排过再计算,十万次只要 1.93 秒,但如果不排就直接计算需要 11.54 秒,时间差不多是原来的六倍
分区大小可以为任意正整数,但分区大小的选择一般需要保证任何一个分区内的编号资源不被用尽,或极少用尽。 对于 INT 或 UNSIGNED INT 类型的列,缺省分区大小是 216 = 65536;对于其它类型的列,缺省分区大小是 232 = 4294967296。因为这些缺省值可能不合适,所以最好明确指定分区大小
编程语言中的操作符 编程语言中的操作符 Table of contents あかやあかしやあやかしの 当初我第一次看到这道题的时候,因为用的是 Java,所以首先想到的是 unsigned right shift 然后再 left shift 回来的结果如果相同的话说明这一位为 0,不同则为 1,然后用同样的方法判断下一位直到数字本身为 0。假设数字一共有 n 比特,那么时间复杂度为 O(n),最好情况是 O(1)。 但事实上如果用 mask 的话有更快一点的方案
最后查到问题了,是因为abs(INT_MIN)是未定义行为,在编译器优化了之后产生了奇怪的结果。 这个未定义行为不在于“有符号数转无符号数”,C的中定义的abs()函数的原型是int abs(int);,返回值仍为int而非unsigned。 发生未定义行为的原因在于abs(INT_MIN)的返回值不能由它的类型(int)表示
对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用的int(11)代表什么意思,很长时间以来我都以为这代表着限制int的长度为11位,直到有天看到篇文章才明白,11代表的并不是长度,而是字符的显示宽度,在字段类型为int时,无论你显示宽度设置为多少,int类型能存储的最大值和最小值永远都是固定的,这里贴一些原文片段 那么照文中所说,所以无论怎么设置int类型的显示宽度,int所能存储的最大值和最小值是固定的,那么这个显示宽度到底有什么用呢? 当int字段类型设置为无符号且填充零(UNSIGNED ZEROFILL)时,当数值位数未达到设置的显示宽度时,会在数值前面补充零直到满足设定的显示宽度,为什么会有无符号的限制呢,是因为ZEROFILL属性会隐式地将数值转为无符号型,因此不能存储负的数值。 注释:如果用navicate软件查询出来并不会显示左边的0,但把数据导出时可看到真实的数据,猜测是软件对数据格式进行了处理? 从上个例子我们可以得出以下几个结论: 如果一个字段设置了无符号和填充零属性,那么无论这个字段存储什么数值,数值的长度都会与设置的显示宽度一致,如上述例子中的字段b,插入数值1显示为00000000001,左边补了10个零直至长度达到11位; 设置字段的显示宽度并不限制字段存储值的范围,比如字段d设置为int(5),但是仍然可以存储1234567890这个10位数字; 设置的字符宽度只对数值长度不满足宽度时有效,如d字段int(5),插入1时,长度不足5,因此在左边补充4个零直到5位,但是插入1234567890时超过了5位,这时的显示宽度就起不了作用了。
现代编译器优化竟然可以作国中等级的代数运算? 这篇是我 2018 年在 stackoverflow 发的问题,当时在 stackoverflow 上也有不少讨论,也让我赚了不少 stackoverflow 点数,最近有机会重新整理一下这篇文章,写在自己的网站上。 不论是 CPU 或是电路设计中,除法的速度都相当慢,是个无论如何都要避免的存在。一般而言,对于可以多次使用的除法,可以用计算倒数之后拿来乘(注:请见文尾)
在处理一个从二进制文件中读取结构数据类型的简单项目时,我遇到了一个奇怪的 printf 格式类型混杂。基本上我大部分时间都使用 %u 格式来显示无符号整数,而在我的结构中是一个类型为 unsigned long long 的成员,以格式显示此数据字符会导致一些奇怪的情况,并且会浪费几个小时来寻找错误类型。 当然,当我使用 %llu 格式时,一切都按预期进行
sizeof是一个在c语言中经常使用的操作符,它是一个在编译期处理的一元运算符,用来计算计算机分配给操作数的内存大小。sizeof的返回值通常是一个由size_t定义的无符号整型常量(可能是unsigned long long)。它可以应用于基本数据类型(int 、char等)、指针类型以及复合数据类型(structure、union等) 复合数据类型: 当操作数为复合数据类型例如 structure union 等时,sizeof()返回计算机寻址单位(通常是8)的整数倍(方便快速查找数组位置)
float 定义浮点型变量(浮点型就是保存小数的) 整形变量自然就是保存整数的变量。为什么要把整数和小数分开呢? 这是因为,在二进制中,只有0和1,没有小数点,因此整数和小数在计算机看来,都是1和0的组合,没有什么区别。 而我们把某一块数据看作小数,那么他就是小数,把它看作整数,他就变成了整数
这是在上看到的一个问题。下面这段小程序的本意是打印出数组中的所有成员: 但是实际的运行结果却不是这么回事。如果编译并运行这段程序的话,你看不到任何输出