浅谈防不胜防的unsigned int的运算

我很早之前就知道,unsigned int与int运算的时候,int会被转化为unsigned int来进行运算。一直觉得定这条规则的人是极度反人类的,虽说unsigned int可以表示更大的正值,但毕竟我们不太会把unsinged想像成一个负数,而一个负的int数可能在无意间就变成了最大的正数。

所以,我对这个问题很慎重。小心翼翼地,一直没怎么出过错。直到有一天。

第一回合

那是一个阳光明媚的午后,我正惬意地刷leetcode。要遍历vector中除最后一个元素的所有元素。我这样写道:

for(int i=0;i<nums.size()-1;++i)
  bulabula;

没什么错吧?没错!提交的时候发现程序出现了内存访问错误。

作为一个自信的程序员,我自然想到了编译器出了问题。于是在VS上测试,是没有问题的!Stupid Leetcode!居然说我的代码有问题,我的代码怎么可能有问题?

就在我要放弃这一题的时候,我突然想到了边界条件,于是把nums清空再测试,VS提示内存访问错误。Soryy Leetcode,是在下输了……

在进行一番绞尽脑汁之后,我把目光聚焦在了size_t,查了资料后发现,size_t就是个unsigned类型,恍然大悟……nums.size()-1就等于最大的正数,i与之比较,肯定是符合条件的!OH NO!

第二回合

在经历了上述事情之后,我一般会这么写程序:

for(int i=0;i<(int)nums.size()-1;++i)
  bulabula;

再也没有出现过问题。每次看到别人还写我之前那样的代码,我都会会意一笑,然后告诉他人的我心得。直到有一天,我看到一个大牛写了这样的代码:

for(int i=nums.size()-1;i>=0;--i)
  bulabula;

我想我发现了大牛的错误。有了上次的教训,这次我测试了一下边界条件。什么?居然正常运行?

在想了很久之后,我得出以下结论:nums.size()-1的确得到了一个最大的unsigned int,可是把它赋给int的时候,编译器就傻傻地直接把unsigned int赋给了int,于是int就为-1了。大牛毕竟是大牛……

在学知识的道路上总会有羊肠小道,多走一些羊肠小道,我才能知道有没有近道!加油加油!

以上就是小编为大家带来的浅谈防不胜防的unsigned int的运算全部内容了,希望大家多多支持我们~

(0)

相关推荐

  • 浅谈防不胜防的unsigned int的运算

    我很早之前就知道,unsigned int与int运算的时候,int会被转化为unsigned int来进行运算.一直觉得定这条规则的人是极度反人类的,虽说unsigned int可以表示更大的正值,但毕竟我们不太会把unsinged想像成一个负数,而一个负的int数可能在无意间就变成了最大的正数. 所以,我对这个问题很慎重.小心翼翼地,一直没怎么出过错.直到有一天. 第一回合 那是一个阳光明媚的午后,我正惬意地刷leetcode.要遍历vector中除最后一个元素的所有元素.我这样写道: fo

  • 浅谈java中的移动位运算:,>>>

    1. 概念 << 左移运算符,左移是在后面补0, num << 1,相当于num乘以2 >> 右移运算符, 右移是在前面补1或0,num >> 1, 相当于num除以2 >>> 无符号右移,是在前面补0, 忽略符号位,空位都以0补齐 另外, 不论是左右还是右移32位,相当于不移动,还是原值. 实际上 在java虚拟机执行这句代码的时候如下这样执行的: 5>>(n%32)--->结果 你这里n=32 :所以5>>

  • 浅谈mysql中int(1)和int(10)的区别

    目录 困惑 数据说话 零填充 总结 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1).领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解释. 其实这不是我第一次遇到这样的问题了,其中不乏有工作5年以上的老司机.包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样. 数据说话 我们知道在mys

  • 浅谈python 四种数值类型(int,long,float,complex)

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结果,在一个新分配的对象的值. Number对象被创建,当你给他们指派一个值.例如: var1 = 1 var2 = 10 您也可以删除数字对象的参考,使用del语句. del语句的语法是: del var1[,var2[,var3[

  • 浅谈java 数据处理(int[][]存储与读取)

    MyFile .java: import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public class MyFile { public static void SaveFile(String filename,int[][] arr){ try { File file = new File(filename); //存放数组数据的文件

  • 浅谈Python实现opencv之图片色素的数值运算和逻辑运算

    数值运算 代码: # -*- coding=GBK -*- import cv2 as cv # 数值运算:加减乘除 def shu_image(src11, src22): src = cv.add(src11, src22) # 加 : 图像对应像素值相加,> 255 时取255 cv.namedWindow("add",0) cv.resizeWindow("add", 300, 300) # 设置播放窗口长和宽 cv.imshow("add&

  • 浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别

    目录 Int Integer和Integer.valueOf() new Integer() 三者之间的比较 Int Int是Java八种基本数据类型之一,一般大小为4字节32位,取值范围为2-31-231.两个Int类型变量用"=="比较的是值的大小. package com.company.algorithm; public class Main { public static void main(String[] args) { int a = 100; int b = 100;

  • 浅谈linux几种定时函数的使用

    在程序开发过程中,我们时不时要用到一些定时器,通常如果时间精度要求不高,可以使用sleep,uslepp函数让进程睡眠一段时间来实现定时, 前者单位为秒(s),后者为微妙(us):但有时候我们又不想让进程睡眠阻塞在哪儿,我们需要进程正常执行,当到达规定的时间时再去执行相应的操作, 在linux下面我们一般使用alarm函数跟setitimer函数来实现定时功能: 下面对这两个函数进行详细分析: (1)alarm函数 alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,

  • 浅谈c语言中类型隐性转换的坑

    谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换. 举例子如下: #include <stdio.h> void func(void) { int i = 1; unsigned char c1 = 1; signed char c2 = -1; if (c2 > i){ printf("\r\n -1 > 1"); } else{ printf("\r\n -1 <= 1");

  • 浅谈C++内存分配及变长数组的动态分配

    第一部分 C++内存分配 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存 储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员

随机推荐