เพราะเหตุใดทุบตีจึงคิดว่า: 016 + 1 = 15


60

ใครสามารถอธิบายให้ฉันฟังได้ว่าเพราะเหตุใดตัวเลขที่มี 0 นำแสดงพฤติกรรมตลกนี้

#!/bin/bash
NUM=016 
SUM=$((NUM + 1)) 
echo "$NUM + 1 = $SUM"

จะพิมพ์:

016 + 1 = 15


3
Psst: printf "%03d\n" 10สามารถใช้งานได้อย่างสมบูรณ์ในการทุบตีเพื่อรับค่าศูนย์นำสำหรับชื่อไฟล์และอื่น ๆ
Squeezy

@Squeezy ขอบคุณ แต่ส่วนนั้นทำงานอยู่แล้ว ปัญหาที่เกิดขึ้นจริงไม่ได้รับชื่อไฟล์ที่มี 0 นำมันกำลังค้นหาสิ่งที่ชื่อไฟล์เป็นจำนวนสูงสุดแล้วสร้างลำดับต่อไปในลำดับโดยใช้ printf "คำนำหน้า -% 03d.tif" $ SUM
DeltaLima

8
โปรดทราบว่าคุณสามารถหาคำตอบได้ด้วยตัวเองเพียงแค่ทำecho $((016))
เม.ย.

2
FYI นี่เป็นเรื่องจริงในภาษาการเขียนโปรแกรมหลายภาษา: C, C ++, Javascript
พอลเดรเปอร์

คำตอบ:


128

ความเข้าใจผิดคือตัวเลขไม่ได้หมายถึงสิ่งที่คุณคาดหวัง

ศูนย์นำหมายถึงจำนวนที่มีฐาน 8. Ie เป็นเช่นเดียวกับ016 หากคุณต้องการที่จะให้เป็นศูนย์ชั้นนำแล้วคุณจะต้อง8#1610#016

> num=016
> echo $((num))
14
> echo $((10#$num))
16

23
มีคน 10 ประเภทในโลกนี้ ผู้ที่เข้าใจเลขฐานสองผู้ที่ไม่ได้คาดหวังเรื่องตลก 8 ฐานและผู้คนอีก 5 คน
Jon Story

42

เพราะ:

~$ echo $((NUM))
14

ถ้าตัวเลขเริ่มต้นด้วย 0 จะถือว่าเป็นค่าฐานแปดและ 16 ในฐานแปดคือ 14 ในทศนิยม


2
ที่ทำให้รู้สึกดีและอธิบายว่าทำไมสคริปต์ของฉันถูกเขียนทับไฟล์เก่าของฉัน :-(
DeltaLima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.