ระบบปฏิบัติการของฉันเป็นแบบ 32 บิตหรือ 64 บิต


52

มันไม่สำคัญเกินไปอีกต่อไป แต่บางครั้งบางคนจำเป็นต้องรู้

นี่คือสนามกอล์ฟที่เรียบง่าย: ไม่ต้องป้อนข้อมูลจากผู้ใช้บอกฉันว่าคอมพิวเตอร์ที่รันโค้ดอยู่บนระบบปฏิบัติการ 64 บิตหรือระบบปฏิบัติการ 32 บิต!

หากโค้ดรันบนระบบปฏิบัติการ 32 บิตให้พิมพ์ "32" หากโค้ดนั้นรันบนระบบปฏิบัติการ 64 บิตเอาต์พุต "64" สำคัญ: พิมพ์สตริงอื่น ๆ ที่ไม่ใช่อักขระว่างของตัวอักษรและตัวเลขหากไม่ใช่ 32 หรือ 64 บิต

โปรดทราบว่าโปรแกรม 32 บิตที่ทำงานบนคอมพิวเตอร์ที่มีระบบปฏิบัติการ 64 บิตควรจะแสดงผลลัพธ์เป็น "64" คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตทุกครั้งที่ทำได้

เพื่อให้มีสิทธิ์ในการเข้ารหัสของคุณจะต้องสามารถทำงานบนWindows 4.10 หรือใหม่กว่า Microsoft ที่รองรับระบบ Windows และ Linux อย่างน้อยหนึ่งรสชาติที่คุณเลือก (ตราบใดที่รสชาตินั้นไม่ฟรี) สามารถติดตั้ง Mod Compatibility ได้ตราบใดที่โปรแกรมยังคงส่งคืนค่าที่ถูกต้อง

ใช้กฎของตามปกติ

หมายเหตุ: หากคำตอบของคุณมีไว้สำหรับพิมพ์ 32 หรือ 64 เท่านั้นไม่ใช่คำตอบ alt ฉันจะยอมรับ แต่ไม่ใช่คำตอบที่แข่งขันกัน

ฉันจะลองและโพสต์ผลการเรียกใช้รหัสเหล่านี้ในระบบปฏิบัติการที่แตกต่างกันในภายหลัง!


5
ดังนั้น"โปรดทราบว่าโปรแกรม 32 บิตที่ทำงานบนคอมพิวเตอร์ที่มีระบบปฏิบัติการ 64 บิตควรส่งออก" 64 "คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตทุกครั้งที่ทำได้" หมายความว่าหากตัวแปลภาษา / ตัวแปลภาษา ฯลฯ พร้อมใช้งานในทั้ง 32 บิตและ 64 บิตระบบปฏิบัติการ 32 บิตจะเรียกใช้ล่าม / etc รุ่น 32 บิตเสมอและระบบปฏิบัติการ 64 บิตจะเรียกใช้ตัวแปล 64 บิตเสมอ / etc ดังนั้นความกังวลเกี่ยวกับความแตกต่างระหว่างโปรแกรมที่เป็น 32 หรือ 64 และระบบปฏิบัติการเป็น 32 หรือ 64 นั้นเป็นเพียงปัญหาสำหรับภาษาที่มีการใช้งานเพียง 32 บิตเท่านั้น ขวา?
Lyndon White

2
วิธีแก้ปัญหามากมายที่นี่จะพิมพ์ "32" บนระบบปฏิบัติการ 64 บิตหากใช้คอมไพเลอร์ 32 บิตเพื่อคอมไพล์โปรแกรม ตกลงไหม
Martin Rosenau

15
"Windows 4.10" ในโลกคืออะไร? หมายความว่า Windows 98 หรือไม่? หรือหมายความว่า Windows NT 4 คุณคิดว่าอะไรที่จะ "ใหม่กว่า" มากกว่านั้น? นี่เป็นความท้าทายที่คิดไม่ถึงเป็นพิเศษ
โคดี้เกรย์

13
ไม่มี "ข้อมูลจำเพาะของ windows อย่างเป็นทางการ" และไม่มีใครอ้างถึง Windows 98 ว่าเป็น "Windows 4.10" คุณเป็นคนแรกอย่างแท้จริง ดังนั้นบางทีแทนที่จะพยายามเสียงเย็นหรืออย่างเป็นทางการโดยใช้หมายเลขรุ่นของคุณควรใช้เพียงชื่อผลิตภัณฑ์ที่เกิดขึ้นจริง อย่างไรก็ตาม Windows 9x ไม่เคยมีให้บริการในรุ่น 64 บิตดังนั้นจึงเป็นเรื่องจริงไหมที่ฉันจะส่งรายการที่ทำงานบน Windows 98 และส่งคืน "32" เท่านั้น ดูเหมือนว่าไม่ยุติธรรม / ไม่น่าสนใจ / ไม่น่าสนใจ แต่จะอนุญาตให้ใช้ตามกฎของคุณในทางเทคนิค
Cody Grey

3
คุณยังไม่ได้ตอบคำถามเกี่ยวกับเวอร์ชั่น Windows ไม่ต้องสามารถทำงานบน Windows 4.10 หรือใหม่กว่าค่าเฉลี่ยใน Windows 4.10 และทุกรุ่นที่ใหม่กว่าหรือบน Windows รุ่นใด ๆ เดียว 4.10 หรือใหม่กว่า ?
Dennis

คำตอบ:


45

x86 แอสเซมบลี (หลายภาษา), 13 ไบต์

bytecode:

31 c0 b4 80 48 70 05 04 40 83 e0 60 c3

กำหนดฟังก์ชั่นที่ส่งกลับ 32 ถ้าตีความว่าเป็น 32- บิต, 64 ถ้า 64- บิตและ 32767 ถ้า 16- บิต

ฉันต้องการสร้างรูปหลายภาษาที่ทำงานบน Windows และ Linux แต่มันยากกว่าที่ฉันคิด เนื่องจากฉันไม่แน่ใจว่าจะมีวิธีการพิมพ์ค่าบน Windows ที่ไม่ใช่แบบ 16 บิตโดยไม่ต้องลิงก์

คำอธิบาย

รหัสนี้ใช้สองบอกเพื่อกำหนดสถาปัตยกรรมมันกำลังทำงานอยู่ อย่างแรกคือคำสั่ง 0x48— บน 16 และ 32 บิตนี่คือdec %eaxแต่ใน 64 บิตมันเป็นคำนำหน้าขนาดคำสั่ง บอกที่สองคือการเรียนการสอนเหมือนกัน แต่เมื่อเราดำเนินการได้ใน 0x8000 ค่าบิตที่สำคัญที่สุดคือการพลิกเท่านั้นถ้าขนาดลงทะเบียนเป็น 16 joบิตการตั้งธงล้นและแจ้งให้เราใช้

ใน 16 บิตรหัสนี้ถูกตีความดังต่อไปนี้:

   0:   31 c0                   xor    %ax,%ax    /* 0x0000 */
   2:   b4 80                   mov    $0x80,%ah  /* 0x8000 */
   4:   48                      dec    %ax        /* 0x7fff */
   5:   70 05                   jo c              /* taken  */
   7:   04 40                   add    $0x40,%al
   9:   83 e0 60                and    $0x60,%ax
   c:   c3                      ret               /* 0x7fff */

ใน 32 บิตรหัสนี้ถูกตีความดังต่อไปนี้:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48                      dec    %eax        /* 0x00007fff */
   5:   70 05                   jo c               /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00007f3f */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000020 */
   c:   c3                      ret

ใน 64 บิตรหัสนี้ถูกตีความดังต่อไปนี้:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48 70 05                rex.W jo c         /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00008040 */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000040 */
   c:   c3                      ret

นี่อาจเป็นจริงในการนำ, ดีมาก
tuskiomi

1
ความคิดที่เรียบร้อยมาก แต่เมื่อนำไปใช้งานจะส่งคืนค่าที่ผิดถ้าประกอบเป็นไบนารีแบบ 32 บิตและรันบนระบบปฏิบัติการ 64 บิต
Cody Grey

@CodyGray จากกฎ: คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตทุกครั้งที่ทำได้ ฉันคิดว่านี่ก็หมายความว่าสำหรับฟังก์ชั่นที่เราสามารถสันนิษฐานได้ว่ารหัสผู้โทรคือ 64 บิตเมื่อใดก็ตามที่เป็นไปได้
Ruslan

อาฉันคิดว่านั่นเป็นการตีความที่ยุติธรรม @Ruslan และฉันเห็นว่าคุณได้โพสต์คำตอบที่ฉันมีในใจแล้วไม่ใช่สำหรับปัญหานี้ :-) คุณมี upvote ของฉัน
โคดี้เกรย์

ไบต์48แทนdec %eaxในโหมด 16 บิตหรือไม่?
phuclv

49

รหัสเครื่อง x86, 12 ไบต์

8c c8 83 f8 23 b0 20 75 02 00 c0 c3

Ungolfed:

getKernelBitness:
    mov eax,cs
    cmp eax,0x23 ; 32 bit process on 64 bit kernel has this selector in CS
    mov al,32
    jne kernelIs32Bit
    add al,al    ; return value in eax
kernelIs32Bit:
    ret

ฟังก์ชั่นนี้ทำงานใน Linux เมื่อใช้ใน ELF32, i386 SysV ABI ต่อไปนี้, เช่นเดียวกับใน Windows / Wine เมื่อใช้ใน PE32, ตามstdcallแบบแผนการโทร


จริงหนึ่งสามารถลดไบต์นับยิ่งถ้าต่อไปอีกวิธีหนึ่ง
Ruslan

ในทางทฤษฎีสิ่งนี้จะทำในสภาพแวดล้อมที่ไม่ใช่ 32/64 บิต?
tuskiomi

1
@tuskiomi ในกรณีใด ๆ รหัสนี้จะยังคงกลับมาทั้ง 32 หรือ 64 ข้อแตกต่างของการตีความลำดับไบต์ในโหมด 16 บิตจะมีการเปลี่ยนแปลงของการขนส่งจากไปeax axดังนั้นหากตัวเลือกcsเกิดขึ้น0x23ผลลัพธ์จะเท่ากับ 64 หรือ 32
Ruslan

สิ่งนี้มีลักษณะเฉพาะกับระบบปฏิบัติการสองระบบโดยเฉพาะ คุณสามารถมีระบบ 32- บิตได้อย่างง่ายดายด้วย cs = 0x23 ดูคำตอบ 8 ไบต์ของฉันแทนเป้าหมาย CPU แทน
เตอร์เฟอร์รี่

@peterferrie ใช่ว่าเป็นเหตุผลที่ผมมีคำตอบอื่น แต่คุณจะสูงกว่า 2 ไบต์
Ruslan

32

Mathematica ขนาด 17 ไบต์

$SystemWordLength

13
แน่นอนว่ามี builtin! \ s (+1)
tuskiomi

คุณไม่ควรเพิ่ม&หรือระบุว่าสิ่งนี้อยู่ใน REPL หรือไม่?
LegionMammal978

5
@atupapa.com ถ้ามันไม่ใช่ " ไม่ "ให้ฟังก์ชั่นที่เมื่อทำงานจะทำสิ่งนี้"; เพียงแค่ "ทำสิ่งนี้"
Patrick Stevens

17
@PatrickStevens: ถ้าคำถามไม่ได้ระบุว่ารูปแบบการส่งควรจะใช้มันเป็นโปรแกรมหรือฟังก์ชั่น แต่ไม่ได้ตัวอย่างโดยค่าเริ่มต้น

3
@ ais523 ฉันจะยืนยันว่าไม่มีความแตกต่างใน Mathematica ระหว่างโปรแกรมฟังก์ชั่นและตัวอย่าง ทุกอย่างเป็นเพียงการแสดงออก
ngenisis

21

Boot Loaders

คุณรู้หรือไม่ว่า GRUB และ IPXE ทั้งสองมีทัวริงภาษาโปรแกรมที่สมบูรณ์สามารถเข้าถึงได้ในเวลาทำงาน? ตระกูลบูตโหลดเดอร์ของ Syslinux ทำไม่ได้ แต่พวกเขาสามารถทำได้

IPXE, 36 ไบต์

#!ipxe
cpuid --ext 29 && echo 64 || echo 32

จำเป็นต้องใช้บรรทัดแรกหากสคริปต์รันจากระยะไกล แต่ไม่ใช่ถ้าพิมพ์โดยตรงที่บรรทัดคำสั่ง

GRUB, 42 ไบต์

if cpuid -l ; then
echo 64
else
echo 32
fi

Syslinux, 186 ไบต์

ขั้นตอนนี้ใช้เวลาสามไฟล์ไฟล์แรกคือ syslinux.cfg (หรือ isolinux.cfg เป็นต้น)

label a
  kernel ifcpu64.c32
  append s -- t

label s
  kernel menu.c32
  append s.cfg

label t
  kernel menu.c32
  append t.cfg

default a
prompt 0
timeout 0

และ t.cfg

menu title 32

ans s.cfg

menu title 64

สำหรับส่วนนี้ส่วนที่ยากคือ syslinux ไม่มีความสามารถในการแสดงข้อความอย่างง่ายดังนั้นเมนูจึงถูกใช้งานในทางที่ผิด


ฉันไม่แน่ใจว่าคุณสามารถบอกความละเอียดของระบบปฏิบัติการด้วยบูตโหลดเดอร์ได้หรือไม่ แต่ฉันชอบความคิดนี้
tuskiomi

ตรวจสอบ cpu และใช้เพื่อเลือกระบบปฏิบัติการที่เหมาะสม นี่คือรหัส golfed จากโครงการ unboot ของฉัน
hildred

2
ดังนั้นมันจึงเปลี่ยนระบบปฏิบัติการตามสถาปัตยกรรม คิดนอกกรอบ. ฉันชอบ.
tuskiomi

bytecount คืออะไร
Restioson

1
@hildred ฉันเชื่อว่ามันจะอ่านง่ายขึ้นถ้าคุณใช้## iPXE, 36 bytesแทน### ipxe 36
NieDzejkob

21

Julia 14 13 ไบต์

n->8sizeof(1)

อธิบาย:

  • ฟังก์ชั่นอานนท์ทำทุกอย่าง (รวมถึงnothing) คืนค่าจำนวนเต็ม 32 หรือ 64
  • ตัวอักษรจำนวนเต็มเป็นประเภทIntซึ่งขึ้นอยู่กับว่า 32 บิตหรือ 64 บิตเป็นทั้งInt32หรือInt64( 1อาจเป็นตัวเลขใด ๆ )
  • การวางตัวเลขไว้ก่อนการเรียกใช้ฟังก์ชันจะเป็นการเพิ่มจำนวนทวีคูณ
  • นี่เป็นรหัสSys.WORD_SIZEย่อสำหรับใช้ในคำตอบของ rahnema1

คำตอบที่สนุกอื่น ๆ คือ()->"$(Int)"[4:5]แต่ฉันไม่สามารถนับลงบนที่หนึ่ง


-1 ต้องขอบคุณ @Roman Gräf


คุณสามารถใช้อาร์กิวเมนต์ดัมมี่: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

จูเลีย, 20 17 16 ไบต์

n->Sys.WORD_SIZE

* ขอบคุณ @LyndonWhite บันทึก 3 ไบต์ * ขอบคุณ @ @ RomanGräfบันทึกไบต์

คำตอบก่อนหน้า:

()->Sys.WORD_SIZE
print(Sys.WORD_SIZE)

ลองออนไลน์!


1
ฉันโดยส่วนตัวชอบสิ่งนี้!
tuskiomi

2
โดยการประชุมดังต่อไปนี้: codegolf.meta.stackexchange.com/q/2419/62131คุณสามารถโกนหนวดได้ 3 ไบต์ด้วยการทำ()->Sys.WORD_SIZE
Lyndon White

1
คุณสามารถใช้อาร์กิวเมนต์ดัมมี่: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js) ขนาด 24 ไบต์

_=>process.arch.slice(1)

นี้เป็นฟังก์ชั่นและผลตอบแทน'32', หรือถ้าค่า'64''rm'


+1 แต่ฉันสมมติว่า 64 บิต arch อาจใช้ระบบปฏิบัติการ 32 บิตได้
Octopus

1
ทำให้ฉัน '32' บน Windows 32 บิตดังนั้นจึงดูเหมือนว่าใช้งานได้
Ken YN

5
คุณสามารถโกนทิ้งได้ 7 ไบต์หากคุณใช้ REPL และosแทนที่จะเป็นprocess:os.arch().slice(1)
GilZ

สิ่งนี้จะส่งคืนสถาปัตยกรรม OS ที่รายงานไปยังกระบวนการไม่ใช่สถาปัตยกรรม OS จริง ดังนั้นนี่ใช้ไม่ได้กับ Linux (ต่อย "setarch" เป็นเครื่องมือค้นหาที่คุณชื่นชอบ)
David Schwartz

@DavidSchwartz มันใช้งานได้ดีบนกล่อง linux ของฉันเว้นแต่ว่าฉันเข้าใจผิด แต่ใน PPCG เราสามารถสมมติสภาพแวดล้อมที่ไม่มีการแก้ไขในแง่ของการที่ผู้ใช้เปลี่ยน arch
Downgoat

12

C, 33 31 29 23 ไบต์

f(){return sizeof&f*8;}

ขอบคุณที่แสดงความคิดเห็น @ceilingcat และ @Dennis สำหรับเคล็ดลับการเล่นกอล์ฟ!


13
นอกจากนี้ยังบอกว่ากฎกติกาการใช้รหัสกอล์ฟปกติและการกลับมาจากฟังก์ชั่นเป็นส่วนหนึ่งของค่าเริ่มต้นของเราสำหรับ I / O
Dennis

11
นั่นจะขึ้นอยู่กับว่าคุณคอมไพล์โปรแกรม 32 หรือ 64 บิตหรือไม่?
Ken YN

4
สิ่งนี้ไม่เป็นไปตามข้อกำหนด " โปรดทราบว่าโปรแกรม 32 บิตที่ทำงานบนคอมพิวเตอร์ที่มีระบบปฏิบัติการ 64 บิตควรจะส่งออก" 64 "ซึ่งจะบอกให้คุณทราบว่าโปรแกรมได้รับการคอมไพล์อย่างไร
David Schwartz

2
@DavidSchwartz "คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตทุกครั้งที่ทำได้"
Klas Lindbäck

2
ขออภัยที่จะกล่าวว่า แต่ขนาดของการประเมินในเวลารวบรวม ดังนั้นถ้าคุณรวบรวม exe 32 บิตและรันบนเครื่อง 64 บิตมันจะ ouput 32 ในขณะที่มันควรจะส่งออก 64 ( stackoverflow.com/questions/2615203/… ) เป็นความคิดที่ดีนะ!
Dinaiz

11

PowerShell ขนาด 16 ไบต์

8*[IntPtr]::Size

รับขนาดตัวชี้เป็นไบต์คูณด้วย 8 เพื่อรับบิต


-1 เพราะyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r หรือใหม่กว่าไม่ใช่และใหม่กว่า ฉันยินดีที่จะเดิมพันคำตอบที่ดีเหล่านี้เป็นเรื่องยากที่ดีที่สุดเพื่อให้ทำงานบน Windows รุ่นที่ไม่ได้รับการสนับสนุนมานาน นอกจากนี้ยังไม่มีเหตุผลที่จะคาดหวังให้ผู้คนทดสอบบน 98 OS ทั้งหมด - มันไม่ง่ายเลยที่จะติดตั้งใน VM วันนี้ (เชื่อฉันสิฉันได้ลองแล้วไม่ต้องทำงานกับ KVM และมีปฏิสัมพันธ์ที่น่าสนใจกับอะแดปเตอร์ดิสเพลย์ VBox) . (หรือแม้แต่จะมีแนวคิด 64 บิต ... นั่นเป็นข้อกำหนดที่ไร้สาระอย่างแท้จริง)
Bob

1
@ ub3rst4r ฉันสงสัยว่าภาษาการเขียนโปรแกรมตีความทั้งหมดที่นี่มีการใช้งานที่ทำงานบน Windows 4.10!
Martin Rosenau

1
ดูเหมือนว่าจะล้มเหลวหากเป็น PowerShell 32 บิตบนระบบปฏิบัติการ 64 บิต
Chris J

@ChrisJ อย่างน้อยใน Win10 และ Win2012 R2 จะส่งคืนผลลัพธ์ที่เหมาะสมจาก x86 PowerShell ยังไม่ได้ทดสอบบน Linux
Booga Roo

10

Python 2, 52, 48, 42 41 ไบต์

from struct import*;print calcsize("P")*8

ขอบคุณมนุษย์ทั้งหมด!


ซูม! ข้ามเส้นในไม่กี่นาที
tuskiomi

ฉันจะระงับการทดสอบจนกว่าฉันจะกลับบ้าน แต่ฉันไม่แน่ใจว่านี่จะพิมพ์ "32" และ "64" แต่ในกรณีอื่นฉันมั่นใจ
tuskiomi

@tuskiomi สิ่งนี้พิมพ์ "32 บิต" หรือ "64 บิต"
Daniel

1
from struct import*;print calcsize("P")*8สั้นกว่า
มนุษย์โดยรวม

12
หากคุณใช้งานบน 32-bit Python ในระบบปฏิบัติการ 64 บิตฉันคิดว่านี่จะเป็นเรื่องโกหกคุณ คำตอบอื่น ๆ ส่วนใหญ่ดูเหมือนจะอ่อนไหวต่อเรื่องนั้น ...
Nick T

10

Java 8, 45 ไบต์

()->System.getProperty("sun.arch.data.model")

@Dopapp สิ่งที่เขาหมายถึงคือนี่เป็นตัวอย่างไม่ใช่โปรแกรมหรือฟังก์ชั่น ใน Java 8 นี้ควรจะทำงาน:n=>System.getProperty("os.arch")
NoOneIsHere

@NoOne อยู่ที่นี่โอ้ขอบคุณที่ข้ามศีรษะของฉัน
Daniel

2
"หากโค้ดรันบนระบบปฏิบัติการ 32 บิตให้พิมพ์" 32 "หากโค้ดนั้นรันบนระบบปฏิบัติการ 64 บิตเอาต์พุต" 64 "ให้พิมพ์สตริงอักขระอื่น ๆ ที่ไม่ใช่อักขระว่างและตัวอักษร (อื่น ๆ ) หากเป็น ค่า. " นี่ไม่ได้ทำอย่างนั้นเลย ...
Olivier Grégoire

4
คุณจะได้รับ Java 8 สำหรับ Windows 98 (v4.10) หรือไม่
TessellatingHeckler

4
@TessellatingHeckler Java 8 ต้องใช้ "i586" (อะไรก็ตามที่มีความหมาย) รายการแจ้งว่า: "รหัสของคุณจะต้องสามารถทำงานบน Windows 4.10 หรือใหม่กว่า" ไม่ใช่ "รหัสของคุณจะต้องสามารถทำงานบน Windows 4.10 และใหม่กว่า" มันทำงานใน Windows ใหม่
Olivier Grégoire


8

Windows CMD, 56 52 ไบต์ (ขอบคุณ Bob!)

if EXIST "%ProgramFiles(x86)%" (echo 64)else echo 32

ยังคงมีความยาวที่น่าประหลาดใจ - ยาวที่สุด!


1
จริงๆแล้ว%windir%\SysWOW64มันสั้นกว่านี้ฉันคิดว่า ...
Bob

7
" จะต้องสามารถทำงานบน Windows 4.10 หรือใหม่กว่าและ Linux อย่างน้อยหนึ่งรสชาติที่คุณเลือก " - รสชาติของ Linux สำหรับสิ่งนี้
TessellatingHeckler

1
@TessellatingHeckler หากคุณติดตั้ง Wine ...
Ken YN

1
สิ่งที่เกี่ยวกับการใช้ชวเลข if EXIST "c:\Progra~3" (echo 64)else echo 32โดยค่าเริ่มต้นคุณมีProgramDataและProgram Filesถ้าหนึ่งในสามมีอยู่เราควรเป็น 64
Marie

3
สิ่งนี้จะพิมพ์สำหรับระบบปฏิบัติการ 8 บิต
tuskiomi

7

C, Win32 API, 103 183 ไบต์

#include <windows.h>
typedef int(WINAPI*F)(HANDLE,int*);b;main(){F f=GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");return(f!=0&&f(GetCurrentProcess(),&b)&&!b)?32:64;}

จริงๆแล้วมีมากกว่า 2 รายที่นี่ ตรวจสอบพวกเขา

  • วิธีที่ง่ายที่สุด: IsWow64Processไม่มีอยู่: เราใช้ระบบปฏิบัติการ 32 บิต

สำหรับสองกรณีถัดไปเราจำเป็นต้องมีความรู้ว่าไบนารีของเราจะเป็นแบบ 32 บิต และคำอธิบายของสิ่งที่จะออกเป็นพารามิเตอร์ออกของIsWow64Process

ตัวชี้เป็นค่าที่ตั้งค่าเป็น TRUE ถ้ากระบวนการกำลังทำงานภายใต้ WOW64 หากกระบวนการทำงานภายใต้ Windows 32 บิตค่าจะถูกตั้งค่าเป็น FALSE หากกระบวนการเป็นแอปพลิเคชัน 64 บิตที่ทำงานภายใต้ Windows 64 บิตค่าจะถูกตั้งเป็น FALSE เช่นกัน

นั่นทำให้เรามีสองกรณีเพิ่มเติม:

  • IsWow64Process มีอยู่และให้ผลตอบแทน TRUE -> เราอยู่ในเครื่อง 64 บิต
  • IsWow64Process มีอยู่และให้ผลเป็น FALSE -> เราอยู่ในเครื่อง 32 บิต

เราไม่ต้องกังวลเกี่ยวกับส่วนที่แอปพลิเคชัน 64 บิตบน Windows 64 บิตให้ผลเป็น FALSE ดังที่เราทราบว่าแอปพลิเคชันของเราคือ 32 บิต

โอ้และมีอีกหนึ่งกรณีที่ไม่ได้รับการคุ้มครองโดยความท้าทายนี้และควรจะหายากอยู่ดี:

  • มี IsWow64Process อยู่ แต่ล้มเหลว: เราใช้ค่าเริ่มต้นเป็นเครื่อง 32 บิต

สิ่งนี้จะครอบคลุมระบบปฏิบัติการ Windows NT ส่วนใหญ่ มีการทดสอบบน Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit และ WinXP SP1 32-Bit


คำตอบเดิม:

#include<windows.h>
main(){return GetProcAddress(GetModuleHandle("Kernel32"),"IsWow64Process")?64:32;}

เพื่อให้แน่ใจว่าเราจำเป็นต้องแยกความแตกต่างเพียง 2 กรณี

  • IsWow64Process ไม่มีอยู่ใน kernel32.dll => เราอยู่ในเครื่อง 32 บิต

  • IsWow64Process ไม่มีอยู่ => เราอยู่ในเครื่อง 64 บิต

มูลค่าจริงที่จัดทำโดยIsWow64Processไม่เกี่ยวข้องกับการท้าทายนี้เนื่องจากเราต้องการให้ไบนารีเป็น 32 บิตในทุกกรณี

ต่างจากคำตอบส่วนใหญ่นี่ไม่ได้ขึ้นอยู่กับไบนารีของตัวเองที่ถูกคอมไพล์บนเครื่องที่มันทำงาน

ถ้าฉันรู้ว่าฟังก์ชั่นที่สั้นกว่านั้นมีเฉพาะใน 64 บิตและไม่ใช่ 32 บิตเครื่องฉันก็สามารถตอบให้สั้นลงได้


2
ปล่อย.dllจากสตริงชื่อโมดูล ไม่เพียง แต่เป็นสิ่งที่ดีสำหรับการเล่นกอล์ฟ แต่จริงๆแล้วมันเป็นการฝึกฝนที่ดีกว่าในการใช้งานปกติเช่นกัน #includeนอกจากนี้สำหรับวัตถุประสงค์ในการเล่นกอล์ฟคุณสามารถวางพื้นที่หลัง
Cody Grey

ขอบคุณฉันต้องการลดทุกสิ่งโดยเพียงแค่มองหาโมดูลที่สามารถพบได้ใน 64 บิต แต่ไม่ใช่ใน 32 บิต ฉันยังคงมอง น่าเศร้า (เพื่อจุดประสงค์นี้) ไม่มีโมดูลที่เรียกว่า WoW64
MrPaulch

มีจริงwow64.dllและWow64Win.dllมี แต่ฉันไม่เคยพยายามโทรGetModuleHandleกับที่ อย่างไรก็ตามปัญหาคือพวกเขาจะถูกโหลดสำหรับกระบวนการ 32 บิตที่รันบนเครื่อง 64 บิตเท่านั้นไม่ใช่สำหรับกระบวนการ 64 บิตที่ทำงานบนเครื่อง 64 บิต
Cody Gray

ฉันมี. พวกเขากลับเป็น 0 แม้กระทั่งบนเครื่อง 64 บิต ทำให้รู้สึกจริง ไม่มีอยู่ที่จะเชื่อมโยงโดยตรง ระบบจะดูแลการเปลี่ยนเส้นทางระหว่างรันไทม์
MrPaulch

โอ้โหมีปัญหา จากเอกสารประกอบ SDK: "โปรดทราบว่าเทคนิคนี้ไม่ใช่วิธีที่เชื่อถือได้ในการตรวจสอบว่าระบบปฏิบัติการเป็น Windows รุ่น 64 บิตหรือไม่เนื่องจาก Kernel32.dll ใน Windows รุ่น 32 บิตปัจจุบันมีฟังก์ชันนี้ด้วย"
โคดี้เกรย์

7

C #, 60 50 ไบต์

_=>System.Environment.Is64BitOperatingSystem?64:32

ขอบคุณ @TheLethalCoder


1
ยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem

4
บันทึก 4 ไบต์หากคุณลบ 'Line'
John

1
ยังสามารถลบ 'สภาพแวดล้อม' ได้ และ 'คอนโซล' สมมติว่าใช้using static System.Environment;และusing static System.Console;
John

1
เปลี่ยนWriteLineไปเป็นWrite
โทมัส Ayoub

7
@John ครั้งสุดท้ายที่ฉันตรวจสอบจะต้องรวมการนำเข้าและจะเพิ่มจำนวนไบต์
Ceshion

6

ทับทิมขนาด 22 ไบต์

p [?a].pack(?p).size*8

["any string"].pack("p")ส่งกลับสตริงที่มีไบต์สอดคล้องกับตัวชี้ที่ชี้ไป"any string"และเป็น 8 ตัวอักษรหากระบบปฏิบัติการเป็น 64- บิตหรือ 4 ตัวอักษรถ้าระบบปฏิบัติการเป็น 32- บิต


เนื่องจากสิ่งนี้ใช้ขนาดตัวชี้สิ่งนี้จะพิมพ์ 32 บิตเมื่อตัวแปล Ruby เป็นไบนารีแบบ 32 บิตบนระบบปฏิบัติการ 64 บิต ดังนั้นคิดถึงกฎ
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.ดังนั้นผู้ใช้ 64- บิตจะถูกสมมติว่ารันทับทิม 64 บิต
หมึกมูลค่า

6

R, 16 ไบต์

.Machine[[18]]*8

ส่งคืนขนาดตัวชี้


1
เช่นเดียวกับโซลูชันขนาดตัวชี้ทั้งหมดนี้จะพิมพ์ผลลัพธ์ที่ไม่ถูกต้องเมื่อโปรแกรมเป็นไบนารีแบบ 32 บิตที่ทำงานบนระบบปฏิบัติการ 64 บิต
DarkDust

1
@DarkDust R ถูกตีความและเราสามารถสันนิษฐานได้ว่าผู้ใช้ใช้ซอฟต์แวร์ 64 บิตหากเป็นไปได้ดังนั้นจึงเป็นล่าม 64 บิต IMHO กฎนี้ใช้กับภาษาที่รวบรวมเท่านั้น
NieDzejkob

@NieDzejkob นั่นเป็นตรรกะแบบเดียวกันกับที่ฉันใช้สำหรับคำตอบของฉันใน PHP เมื่อมีคนอื่นใส่ความคิดเห็นประเภทเดียวกันเพื่อตอบสนองต่อคำตอบของฉันฉันหวังว่าคนอื่น ๆ อ่านคำถามเดียวกันจากที่เราสมมติว่าผู้ใช้จะใช้ 64- ซอฟต์แวร์บิตที่เป็นไปได้ด้วยภาษาที่ตีความ
Bja

6

Perl, 18 15 18 ไบต์

say length pack p8

ฉัน64␤ใช้คอมพิวเตอร์ 32 บิตของฉันเพราะperlสร้างด้วย 64 บิต IV คุณจะพบว่าเป็นกรณีนี้เมื่อใช้งาน Windows รุ่น 32 บิต
Brad Gilbert b2gills

@ BradGilbertb2gills ฉันเปลี่ยนรหัสกลับเป็นรุ่นก่อนหน้า อันนี้ควรใช้งานได้แม้ในกรณีนี้ แจ้งให้เราทราบหากยังใช้งานไม่ได้ฉันจะลบคำตอบของฉัน
Grimmy

1
ทำงานได้อย่างถูกต้อง
Brad Gilbert b2gills

ดูเหมือนว่าผิดใน HP 9000/785 ให้ 32. ฉันไม่คิดว่าจะมีซีพียู HP / PA-RISC แบบ 32 บิตใด ๆ
Ole Tange

6

รหัสเครื่อง x86, 8 ไบต์

31 C0 B0 40 48 24 60 C3

Ungolfed:

31 c0    xor eax,eax
b0 40    mov al, 0x40
48       dec al — in 32-bit mode; "REX.W" in 64-bit mode (ignored)
24 60    and al, 0x60
c3       ret

หากคอมไพล์เป็นเอ็กซีคิวต์ 64- บิทนั้นจะคืนค่า 64 อินeaxและหากคอมไพล์เป็น 32- บิตก็จะคืน 32 - โดยไม่คำนึงถึงระบบปฏิบัติการ

คำตอบนี้ขึ้นอยู่กับกฎว่า:

คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตทุกครั้งที่ทำได้


ในขณะที่นี่เป็นวิธีการที่น่าสนใจมันจะถูกเขียนลงในโปรแกรมในวิธีที่มันสามารถดำเนินการได้จริง? ทุกวิธีที่ฉันสามารถนึกถึงการเรียกใช้รหัสไบนารี่นอกเหนือจากการเขียนฟังก์ชั่นโหลดเดอร์ของคุณเองใช้ไฟล์ที่มีเฉพาะรหัส 64 บิตหรือ 32 บิต ดังนั้นคุณจะต้องสองสำเนาของรหัสนี้ในการทำงานจริง ...
จูลส์

@Jules คุณสามารถใส่เป็นแบบอินไลน์ประกอบลงในโปรแกรมภาษาระดับสูงเช่นที่นี่ จากนั้นคุณเพียงแค่ต้องใช้คอมไพเลอร์แพลตฟอร์มของคุณกับตัวเลือกเริ่มต้นและคุณจะได้รับการเป็นพยาน
Ruslan

@ l4m2 ทำไมคุณตะโกนใส่ฉัน แต่คุณถูกต้องแล้วไบต์ทั้งสองนี้ดูเหมือนจะเป็นขยะที่เหลือจากการทดลองของฉัน จะลบ
Ruslan

5

PHP, 18 ไบต์

<?=PHP_INT_SIZE*8;

สิ่งนี้จัดการกรณีทั้งหมดของ 32, 64 และซีพียูบิตอื่น ๆ อย่างถูกต้องโดยที่ PHP_INT_SIZE นั้นถูกต้องมันจะแสดงขนาดที่แม่นยำของ CPU ไม่ว่า CPU PHP นั้นจะทำงานอะไร!

ถ้า PHP ทำงานอยู่

ระบบปฏิบัติการ 32 บิต PHP_INT_SIZE == 4

ระบบปฏิบัติการ 64 บิต PHP_INT_SIZE == 8

ระบบปฏิบัติการ 16 บิต PHP_INT_SIZE == 2 (ตามหลักวิชา)

ระบบปฏิบัติการ 8 บิต PHP_INT_SIZE == 1 (ในทางทฤษฎี)

ระบบปฏิบัติการ 128- บิต PHP_INT_SIZE == 16 (ยังไม่ประสบความสำเร็จ แต่เป็นไปได้)


2
ค่าคงที่นั้นมีขนาดของระบบปฏิบัติการที่ PHP ถูกสร้างขึ้นไม่ได้ทำงาน
Einacio

2
@Einacio ใช่ แต่ในความท้าทายครั้งแรกผู้โพสต์เขียนว่า "คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใช้ซอฟต์แวร์ 64 บิตเมื่อใดก็ตามที่เป็นไปได้" ดังนั้นหากระบบปฏิบัติการเป็น 64- บิตแล้วเวอร์ชั่นของ PHP ที่ทำงานบนระบบปฏิบัติการจะต้องสันนิษฐานว่า เป็น 64 - bit! (หมายเหตุ: ฉันไม่เห็นว่าสิ่งนี้เป็นช่องโหว่เพียงตรรกะที่บริสุทธิ์จากการท้าทายครั้งแรก)
Bja

4

C # (29 ไบต์)

Console.Write(IntPtr.Size*8);

10
เช่นเดียวกับโซลูชันขนาดตัวชี้ทั้งหมดนี้จะพิมพ์ผลลัพธ์ที่ไม่ถูกต้องเมื่อโปรแกรมเป็นไบนารีแบบ 32 บิตที่ทำงานบนระบบปฏิบัติการ 64 บิต
DarkDust

1
จำเป็นต้องระบุว่าสิ่งนี้ได้รับการรวบรวมสำหรับ "AnyCPU" โดยไม่ได้เลือกช่องทำเครื่องหมาย "ชอบ 32- บิต"
Cody Grey

4

PowerShell, 17 52 ไบต์

try{32+32*((gci \*`))-or(arch)[-1]-eq52)}catch{32}

ส่งคืน 64 หากข้อใดข้อหนึ่งต่อไปนี้เป็นจริง:

  • Program Files (x86)คุณมีไดเรกทอรีบนไดรฟ์ปัจจุบันของคุณด้วยชื่อไฟล์ที่ลงท้ายด้วยวงเล็บใกล้ชิดคิดถูกในการตรวจสอบ
  • archส่งกลับสตริงที่ลงท้ายด้วย4(ASCII 52) เช่นเมื่อเทียบกับเช่นx86_64i686

ลองจับมีวัตถุประสงค์เพื่อหลีกเลี่ยงข้อผิดพลาดที่คุณได้รับถ้าGCIผลตอบแทนอะไรและคุณไม่ได้มีซุ้มประตู ฉันไม่ได้พบวิธีที่สั้นกว่าที่จะทำได้จนถึงตอนนี้ gciถูกใช้งานมากกว่าlsเพราะบน Linux, lsจะสร้างข้อผิดพลาดที่มองเห็นได้

รุ่นนี้ควรตรวจสอบว่าระบบปฏิบัติการเป็นแบบ 64 บิตไม่ใช่แค่ PowerShell และผ่านการทดสอบการทำงานบน Windows และ Linux สำหรับการสนับสนุน Mac แทนที่ด้วยarchuname -m

เวอร์ชั่นก่อนหน้าของ Windows เท่านั้น: -!(ls \*`))*32+64


linux distro ทำงานแบบใด
tuskiomi

@tuskiomi โอ้ไม่ดีของฉัน - ฉันเห็นสิ่งที่คุณหมายถึง อ่านความท้าทายไม่ถูกต้อง ฉันควรลบคำตอบหรือไม่
Andy C.

ถ้าคุณรู้ว่ามันจะใช้งานได้กับไวน์คุณควรเก็บมันไว้
tuskiomi

@tuskiomi อย่างน้อย Ubuntu 14.04, 16.04, RHEL7, CentOS7 และ SUSE บางรุ่น: github.com/PowerShell/PowerShell/PowerShell/releases
Xudonax

4

สวิฟต์ 4 รีเพลย์ / สนามเด็กเล่น, 12 ไบต์

Int.bitWidth

IntคือขนาดของคำโดยทำตัวเหมือนInt32หรือInt64ขึ้นกับระบบ


รหัสนี้ไม่ได้เป็น snip ดังนั้นควรพิมพ์หรือไม่ หรือว่าคุณกำลังใช้ REPL หลีกเลี่ยงข้อ จำกัด นั้น?
Lyndon White

1
มันขึ้นอยู่กับกรรมการ การใช้งาน REPL นั้นไม่ธรรมดา แต่ Swift Playgrounds เป็นที่นิยมมาก (โดยเฉพาะบน iPad) ส่วนตัวฉันคิดว่ามันเป็นเกมที่ยุติธรรม ผู้คนออกแบบภาษาการเขียนโปรแกรมแบบกำหนดเองสำหรับการตีกอล์ฟซึ่งพิมพ์ค่าโดยปริยายและนี่ก็ไม่ต่างกัน
Alexander

4

ทับทิมขนาด 10 ไบต์

p 0.size*8

ในขณะที่ทับทิมสามารถใช้จำนวนเต็มของความยาวใด ๆ Fixnumภายในจะเก็บค่าที่เหมาะสมในคำเครื่องเป็น เมธอดFixnum#sizeจะส่งคืนความยาวเป็นไบต์ของคำเครื่องเสมอ

Fixnumระดับจะถูกลบออกในรูบี 2.4.0 Integerการทำงานของมันถูกรวมอยู่ในระดับ รหัสย่อมาจาก


4

เชลล์ขนาด 26 ไบต์

uname -m|awk \$0=/_/?64:32

คุณสามารถใช้แทนarch uname -m
เดนนิส

1
@Dennis ไม่จำเป็น บน MacOS: uname -m-> x86_64แต่->arch i386เนื่องจาก macos :( นอกจากนี้ยังเป็น bash เฉพาะ - ล้มเหลวบน zsh
viraptor

@StevenPenny zshจะพยายามตีความ?สัญลักษณ์ตัวแทนแบบกลม/ เดี่ยว
Doorknob

ทำงานบน Windows หรือไม่
Ajasja

1
@Ajasja กับ Cygwin
Steven Penny


4

C, 22 ไบต์

f(){return(int**)0+8;}

นี่เป็นคำตอบตามขนาดตัวชี้ที่ถือว่าเป็นไบนารีดั้งเดิม 0ถูกโยนไปint**(ที่อยู่0x0) จากนั้นเราก็เพิ่ม 8-0 ซึ่งในความก้าวหน้า C, sizeof(int*)*8ตัวชี้โดย 4 ไบต์ * 8 บิต = 32, 8 ไบต์ * 8 บิต = 64 ดังนั้นเราจึงได้รับ(int**)0x20และ0x40ซึ่งจะถูกส่งเป็นจำนวนเต็มโดยการส่งคืนจากintฟังก์ชันการคืนค่าโดยปริยาย

C, สแตนด์อะโลน, 34 ไบต์

main(){printf("%d\n",(int**)0+8);} 

C, สนุกกับ Unicode, รหัส 30 คะแนน, 34 ไบต์ (UTF-8)

main(){puts((int**)U" ㈳㐶"+1);}

ฉันพยายามที่จะเข้าใจว่ามันใช้งานได้อย่างไร แต่ฉันไร้เดียงสา คุณสามารถเพิ่มคำอธิบายได้ไหม?
NieDzejkob

@jbcreix ฉลาด ...
NieDzejkob

3

Java, 50 ไบต์

int b(){return com.sun.jna.Native.POINTER_SIZE*8;}


นั่นคือห้องสมุดหรือไม่? ถ้าใช่คุณควรพูดถึงมัน! ฉันไม่เห็นว่าคลาสนั้นมีอยู่ใน JDK 8 ของ Oracle (ฉันไม่มี JDK ปกติ 6 และ 7 ตามการจัดการของฉัน atm)
Olivier Grégoire

2
คำตอบนี้ไม่ถูกต้อง มันไม่ได้พิมพ์
Philipp

6
การอ้างถึงเดนนิส:> นอกจากนี้ยังกล่าวว่ามีการใช้กฎกติกากอล์ฟตามปกติและการส่งคืนจากฟังก์ชั่นเป็นส่วนหนึ่งของค่าเริ่มต้นสำหรับ I / O
Asu

เปลี่ยนเป็นฟังก์ชั่น lamba สำหรับจำนวนไบต์ที่น้อยกว่า:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 ไบต์

<?=@php_uname(m)[-1]-4?32:64;

https://3v4l.org/Y6JXv


โอ ฉันชอบอันนี้ มันทำงานยังไง?
tuskiomi

4
php_uname('m')ส่งคืนx86_64บนระบบปฏิบัติการ 64 บิตไม่อย่างi386นั้น 4เป็นอักขระที่ 6 (ดัชนีที่ 5 0) ของสตริง, '4' - 4 == 0 == false. และ@เพียงแค่หยุดการเตือนสำหรับสตริงที่ไม่ได้ระบุไว้และไม่ได้กำหนดค่าเริ่มต้น
Petah

2
สิ่งนี้ตรวจพบสถาปัตยกรรมของ PHP ไม่ใช่ของระบบปฏิบัติการ ผมทำงาน 32 บิต PHP บน Windows 64-bit, ผลตอบแทนphp_uname('m') 'i586'
Gras Double

@GrasDouble ดีฉันเดา YMMV Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64ผมทำงานให้ฉันด้วย
Petah

1
@tuskiomi สิ่งนี้จะพิมพ์ 64 หากมีระบบปฏิบัติการ 8 บิต
Bja

3

Python 3 , 77 84 71 59 ไบต์

-13 ไบต์ขอบคุณ @JonathanAllan!
ลงไปที่ 59 โดย @Clearer

from platform import*;print({'4':64,'6':32}[machine()[-1]])

ลองออนไลน์!

การเขียนรหัสเวลากำปั้นของฉัน :)
ควรเอาท์พุทเวอร์ชันที่ถูกต้องแม้ในขณะที่ใช้ 32Bit-Python บน 64bit-OS
สมมติว่าplatform.machine()ให้i*86หรือx86สำหรับ 32Bit-OS ฉันไม่มีที่ว่างในการตรวจสอบสิ่งนี้ เอาท์พุทคือ0เมื่อระบบปฏิบัติการไม่ได้อยู่ใน 64/32 บิต
แก้ไข: เพิ่มคำสั่งการพิมพ์ดังนั้นมันจึงมีความยาว 7 ไบต์


ไม่แน่ใจว่าเป็นที่ยอมรับหรือไม่เนื่องจากสามารถเรียกใช้ระบบปฏิบัติการ 32 บิตบนเครื่อง 64 บิต (หรือมีเครื่องที่เรียกว่า a foo86ที่เป็น 64 บิต: p) แต่ถ้าเป็นที่ยอมรับคุณสามารถบันทึก 9 (แก้ไข .. 0.13) print((a==64)*a+32*(a==86))ไบต์ด้วย
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])ก็จะทำงานเช่นกัน
ชัดเจน

@Clearer สิ่งนี้จะพลาดข้อ จำกัด ต่อไปนี้: สำคัญ: พิมพ์สตริงอักขระและตัวเลขที่ไม่ใช่อักขระว่างอื่น ๆ หากไม่ใช่ 32 หรือ 64 บิต .
tOmAtE

@tOmAtE หากไม่ใช่ 32 หรือ 64 บิตจะมีข้อผิดพลาดซึ่งจะพิมพ์สตริงที่ไม่ว่างเปล่า
ชัดเจน

2
ลองใช้สถาปัตยกรรม () บันทึก dict: from platform import*;print(architecture()[0][:2])-> 50 ไบต์
bugmenot123
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.