Hm, I’m not sure how you handle that.
When my player is located in the top left, he’s at (0, 0) and when he moves right it’s in a positive direction, same goes for down. This way my location range just goes from x = [0…width_in_pixels], y = [0…height_in_pixels] (width/height being that of the map).
Here’s my complete render code, and as you can see, then the “player” is actually just an offset in this case. So if I’d want my player to be able to move independent of the viewport, I’d just keep track of him and my offset, both in the same way as I explained above. 
public void render(Graphics2D g) {
// Tiles on the screen
int tilesAcross = (int) Math.ceil(this.me.getWidth() / MapEditor.TILE_SIZE) + 3;
int tilesDown = (int) Math.ceil(this.me.getHeight() / MapEditor.TILE_SIZE) + 3;
// Tile the player is on
int ptx = this.me.player.x / MapEditor.TILE_SIZE;
int pty = this.me.player.y / MapEditor.TILE_SIZE;
// The offset of the tile
int xOffset = this.me.player.x % MapEditor.TILE_SIZE;
int yOffset = this.me.player.y % MapEditor.TILE_SIZE;
int tilesRendered = 0;
for (int x = 0; x < tilesAcross; x++) {
for (int y = 0; y < tilesDown; y++) {
tilesRendered++;
int tx = ptx + x - tilesAcross / 2;
int ty = pty + y - tilesDown / 2;
int rx = x * MapEditor.TILE_SIZE - (MapEditor.TILE_SIZE + xOffset) - 16;
int ry = y * MapEditor.TILE_SIZE - (MapEditor.TILE_SIZE + yOffset) - 10;
if (tx < 0 || tx >= this.me.map.width || ty < 0 || ty >= this.me.map.height) {
g.setColor(Color.BLACK);
g.fillRect(rx, ry, MapEditor.TILE_SIZE, MapEditor.TILE_SIZE);
continue;
}
Tile currentTile = this.me.map.getTile(tx, ty);
g.drawImage(currentTile.getImage(), rx, ry, null);
drawCorners(rx, ry, currentTile, g);
}
}
// Paint the player
g.setColor(Color.black);
g.drawLine(this.me.getWidth() / 2, this.me.getHeight() / 2 - 3, this.me.getWidth() / 2, this.me.getHeight() / 2 + 3);
g.drawLine(this.me.getWidth() / 2 - 3, this.me.getHeight() / 2, this.me.getWidth() / 2 + 3, this.me.getHeight() / 2);
}
(this.me is a reference to the MapEditor object)
Here’s a screenshot of my Map Editor:
The little x in the middle of the water is the “players” location
The map is 100x100 tiles, so 3200x3200 pixels. 
As you can see, there’s no negative offsets. 
I hope this helps a little