diff --git a/src/slopBed/slopBed.cpp b/src/slopBed/slopBed.cpp
index bce7797f6396351a55009c7c81cea6f875d7e92c..8657402c38682f0e0fcb947bac259ecbefb4c273 100644
--- a/src/slopBed/slopBed.cpp
+++ b/src/slopBed/slopBed.cpp
@@ -50,12 +50,12 @@ void BedSlop::SlopBed() {
     while (_bed->GetNextBed(bedEntry)) {    
         if (_bed->_status == BED_VALID) {
             if (_fractional == false) {
-                AddSlop(bedEntry, (int) _leftSlop, (int) _rightSlop);
+                AddSlop(bedEntry);
             }
             else {
-                int leftSlop  = (int) (_leftSlop  * bedEntry.size());
-                int rightSlop = (int) (_rightSlop * bedEntry.size());
-                AddSlop(bedEntry, leftSlop, rightSlop);
+                _leftSlop  = _leftSlop  * (float)bedEntry.size();
+                _rightSlop = _rightSlop * (float)bedEntry.size();
+                AddSlop(bedEntry);
             }
             _bed->reportBedNewLine(bedEntry);
         }
@@ -64,29 +64,29 @@ void BedSlop::SlopBed() {
 }
 
 
-void BedSlop::AddSlop(BED &bed, int leftSlop, int rightSlop) {
+void BedSlop::AddSlop(BED &bed) {
 
     // special handling if the BED entry is on the negative
     // strand and the user cares about strandedness.
-    CHRPOS chromSize = _genome->getChromSize(bed.chrom);
+    float chromSize = (float)_genome->getChromSize(bed.chrom);
 
     if ( (_forceStrand) && (bed.strand == "-") ) {
         // inspect the start
-        if ( (static_cast<int>(bed.start) - rightSlop) > 0 ) bed.start -= rightSlop;
-        else bed.start = 0;
+    	float newStart = (float)bed.start - _rightSlop;
+    	bed.start = (newStart > 0 ) ? (CHRPOS)newStart : 0;
 
-        // inspect the start
-        if ( (static_cast<int>(bed.end) + leftSlop) <= static_cast<int>(chromSize)) bed.end += leftSlop;
-        else bed.end = chromSize;
+        // inspect the end
+    	float newEnd = (float)bed.end + _leftSlop;
+    	bed.end = (newEnd < chromSize ) ? (CHRPOS)newEnd : (CHRPOS)chromSize;
     }
     else {
         // inspect the start
-        if ( (static_cast<int>(bed.start) - leftSlop) > 0) bed.start -= leftSlop;
-        else bed.start = 0;
+    	float newStart = (float)bed.start - _leftSlop;
+    	bed.start = (newStart > 0 ) ? (CHRPOS)newStart : 0;
 
         // inspect the end
-        if ( (static_cast<int>(bed.end) + rightSlop) <= static_cast<int>(chromSize)) bed.end += rightSlop;
-        else bed.end = chromSize;
+    	float newEnd = (float)bed.end + _rightSlop;
+    	bed.end = (newEnd < chromSize ) ? (CHRPOS)newEnd : (CHRPOS)chromSize;
     }
 }
 
diff --git a/src/slopBed/slopBed.h b/src/slopBed/slopBed.h
index 1fd1aba2ccc5de333734dc345f1a35fa2f41fdc6..119c3d8bb5797d6223b2b81d440df82e51acfde7 100644
--- a/src/slopBed/slopBed.h
+++ b/src/slopBed/slopBed.h
@@ -57,5 +57,5 @@ private:
     void SlopBed();
 
     // method to add requested "slop" to a single BED entry
-    void AddSlop(BED &bed, int leftSlop, int rightSlop);
+    void AddSlop(BED &bed);
 };
diff --git a/test/slop/test-slop.sh b/test/slop/test-slop.sh
index d11ce3af64f7b3a044f736f5cc9bf50ca01cde0b..33a89837973ef37f1e213bae69bea96dd09f4b02 100644
--- a/test/slop/test-slop.sh
+++ b/test/slop/test-slop.sh
@@ -134,4 +134,16 @@ echo \
 chr1	0	1000	a2	2	-" > exp
 $BT slop -i a.bed -b 2000 -s -g tiny.genome > obs
 check obs exp
-rm obs exp
\ No newline at end of file
+rm obs exp
+
+###########################################################
+# test slop factor being larger than a signed int
+###########################################################
+echo "    slop.t12...\c"
+echo \
+"chr1	0	1000	a1	1	+
+chr1	0	1000	a2	2	-" > exp
+$BT slop -i a.bed -b 3000000000 -s -g tiny.genome > obs
+check obs exp
+rm obs exp
+